logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[AVR][C] LCD2USB - USB na innych pinach

manekinen 13 Mar 2010 14:41 3994 7
REKLAMA
  • #1 7823266
    manekinen
    Poziom 29  
    Hej,

    Przerabiam po raz kolejny LCD2USB, tutaj jest pierwsza wersja -> https://www.elektroda.pl/rtvforum/topic1253968.html

    Wtedy przebudowałem bibliotekę LCD aby można było używać dowolnych pinów na dowolnych portach, i kilka drobnych zmian. Tym razem robię pod płytkę przewlekaną i znów musiałem wszystkie piny przekonfigurować, ale tym razem włącznie z pinami usb. Wszystko ok po za USB... komputer wywala błąd urządzenia USB...

    Oto zmiany jakie poczyniłem dla zmiany pinów USB (zmiana dotyczy całego portu z C na D, linie DATA pozostały na bitach 0 i 1):

    W usbconfig.h
    
    #define	USB_CFG_IOPORTNAME		C
    

    na
    
    #define	USB_CFG_IOPORTNAME		D
    


    W main.c
    
    #define USBDDR DDRC
    #define USB_CFG_IOPORT PORTC
    

    na
    
    #define USBDDR DDRD
    #define USB_CFG_IOPORT PORTD
    

    oraz
    
    /* all outputs except INT0 and RxD/TxD */
      DDRD = ~(_BV(2) | _BV(1) | _BV(0));  
      PORTD = 0;
      PORTC = 0;		   /* no pullups on USB pins */
      DDRC = ~0;		   /* output SE0 for USB reset */
    
      /* USB Reset by device only required on Watchdog Reset */
      _delay_loop_2(40000);   // 10ms
    
      DDRC = ~USBMASK;	   /* all outputs except USB data */
      usbInit();
    
    

    na
    
    /* all outputs except INT0 and RxD/TxD */
      //DDRD = ~(_BV(2) | _BV(1) | _BV(0));
    
      DDRD &= ~_BV(2); /*INT0  wejście*/
      DDRD &= ~_BV(1); /*DATA- wejście*/
      DDRD |= _BV(0);  /*DATA+ wyjście*/
      PORTD = 0;       
      //DDRD = ~0;            /* output SE0 for USB reset */
    
      /* USB Reset by device only required on Watchdog Reset */
      _delay_loop_2(40000);   // 10ms
    
      DDRD = ~USBMASK;	   /* all outputs except USB data */
      usbInit();
    


    Linie DATA+ i DATA- są na pinach TxD i RxD więc z programu usunąłem wszystko co związane z uartem, było tam jakieś debugowanie, nawet chyba nie używane.

    Dodaje cały kod w załączniku, a oryginał na dole strony http://www.harbaum.org/till/lcd2usb/index.shtml

    Nie wiem, może jakiś głupi błąd robię, męcze się z tym i męcze i już chyba wszystkie możliwe sposoby przetestowałem i nic... będe wdzięczny za jakąś pomoc przy tym :)

    Schemat:
    [AVR][C] LCD2USB - USB na innych pinach

    Pozdrawiam :)
  • REKLAMA
  • #2 7831461
    saper_2
    Poziom 18  
    Zakładam ,że fusy masz dobrze... Więc sprawdź czy czasem nie włączasz USART'a bo zajmujesz RxD i TxD (ja widzę ,że są tam jakieś dołączone unity z vusb debugowania... )

    I mały hint nie musisz extra dołączać D+ do 2 pinów (jeden do INT0 ,a drugi sterujący) wystarczy iż podłączysz go do int0 i w sterowniku ustawia się ,że D+ używa nogi z przerwaniem
  • REKLAMA
  • #3 7836667
    manekinen
    Poziom 29  
    saper_2 napisał:
    Zakładam ,że fusy masz dobrze... Więc sprawdź czy czasem nie włączasz USART'a bo zajmujesz RxD i TxD (ja widzę ,że są tam jakieś dołączone unity z vusb debugowania... )

    No właśnie, o tym pisałem wyżej. Usunąłem z kodu jeszcze
    //#include "oddebug.h"


    oraz
    //odDebugInit();

    która jest tuż przed inicjowaniem linii usb, które pokazałem wyżej.
    Wydaje mi się że usarta nie ruszam choć z C to ja cienias jestem i możliwe że coś przegapiłem. Lub przegapiłem coś innego...

    saper_2 napisał:
    I mały hint nie musisz extra dołączać D+ do 2 pinów (jeden do INT0 ,a drugi sterujący) wystarczy iż podłączysz go do int0 i w sterowniku ustawia się ,że D+ używa nogi z przerwaniem

    Nie wiem, wolałem zrobić tak jak jest w oryginale, te same piny portu czyli bity 0 i 1. Mógłbyś pokazać jak to zrobić?

    Czy nikt na prawdę nie wie co należałoby jeszcze w tym kodzie zmienić żeby to ruszyło? Układ uruchamiam na płtce stykowej ale wiele już zabawek z AVR i USB w ten sposób uruchamiałem i nigdy problemów nie było więc winę zwalam na kod :(
  • #4 7838578
    tomek_byd
    Poziom 13  
    Może nie jestem ekspertem od AVR ale może moje świeże spojrzenie coś da.
    Po pierwsze to wyeliminował bym inne przyczyny. Dla podejrzanych linii wykorzystał bym inny port. Jeśli to jest na płytce stykowej to nie będzie z tym żadnego problemu. Jeśli się potwierdzi, że na liniach innego portu działa, a na tych z portu D nie to trzeba szukać potwierdzenia, że jest użyty w kodzie USART. Sądzę, że najlepszym wyjściem będzie otworzenie np. w AVR studio wygenerowanego hex'a i sprawdzenie czy nie ma operacji na komórkach odpowiedzialnych za USART. Tak na szybko widzę, że to UCSRB czyli powinna się pojawić komenda OUT 0x0A. Może jeszcze kwestia domyślnego włączenia jakiś alternatywnych funkcji linii portu D.
    Na samym początku zabawy z Atmegami (chodź teraz nie jestem dużo dalej) spotkałem się z takim problemem, że jeden program działał na pewnych portach, a na innych nie. Problem dotyczył dokładnie pinów od USART. Okazało się, że w mikro kontrolerze był wgrany bootloader który włączał USART, próbował załadować przez niego program i potem przechodząc do początku głównego programu nie wyłączał go i musiałem jawnie wyłączać USART na początku każdego programu.
  • Pomocny post
    #5 7874221
    saper_2
    Poziom 18  
    Przy programowaniu rozkaz erase czyści całą pamięć no chyba ze masz skonfigurowane fusy LPM i SPM (albo jakoś tak).
    Ja niedawno trochę się męczyłem ze swoją nową wersją "customized-USBasp" :) i problem leżał mi w resecie, zresztą w sofcie jest "dziwny zapis" na resetowanie :) ( i konfigurację portu). Ja napisałem po swojemu całą inicjację portów, przynajmniej się nie gubię :D, a fragment z resetem ("Output SE0 for usb reset" - SE0 to chodzi o reset usb :) ) (PD2 D+, PD3 D-):
    
    	DDRD |= (1<<PD2 | 1<<PD3);
    	PORTD &= ~(1<<PD2 | 1<<PD3);	
    	delay1ms(15);
    	DDRD &= ~(1<<PD2 | 1<<PD3);
    

    Oczywiście użyłem moich własnych funkcji opóźnień bo te "gotowe" jakoś nie trawię :)
    I oczywiście nie zapomniałeś też zmienić:
    
    #define USB_CFG_DMINUS_BIT      3
    /* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
     * This may be any bit in the port. Please note that D+ must also be connected
     * to interrupt pin INT0!
     */
    #define USB_CFG_DPLUS_BIT       2
    



    manekinen napisał:

    saper_2 napisał:
    I mały hint nie musisz extra dołączać D+ do 2 pinów (jeden do INT0 ,a drugi sterujący) wystarczy iż podłączysz go do int0 i w sterowniku ustawia się ,że D+ używa nogi z przerwaniem

    Nie wiem, wolałem zrobić tak jak jest w oryginale, te same piny portu czyli bity 0 i 1. Mógłbyś pokazać jak to zrobić?

    Hmmm... zawile to napisałem :D , chodzi o to ażeby D+ podłączyć tylko do portu PD2 (int0) ,wtedy zwolni ci się jeden pin. Zobacz na obrazek Na górze mój, na dole twój aktualny układ :) .

    PS. Jeśli znajdę jakąś m8 w dipie w domu to może w piątek potestuję u siebie jak to działa...
  • REKLAMA
  • #6 7874339
    manekinen
    Poziom 29  
    saper_2 napisał:
    Przy programowaniu rozkaz erase czyści całą pamięć no chyba ze masz skonfigurowane fusy LPM i SPM (albo jakoś tak).

    Mówisz o eeprom? Jeśli tak to jest bez różnicy bo tam są przechowywane jedynie nastawy kontrastu i podświetlenia
    saper_2 napisał:

    I oczywiście nie zapomniałeś też zmienić:
    
    #define USB_CFG_DMINUS_BIT      3
    /* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
     * This may be any bit in the port. Please note that D+ must also be connected
     * to interrupt pin INT0!
     */
    #define USB_CFG_DPLUS_BIT       2
    

    Pinów w ogóle nie ruszałem, są na bitach 0 i 1

    saper_2 napisał:

    manekinen napisał:

    saper_2 napisał:
    I mały hint nie musisz extra dołączać D+ do 2 pinów (jeden do INT0 ,a drugi sterujący) wystarczy iż podłączysz go do int0 i w sterowniku ustawia się ,że D+ używa nogi z przerwaniem

    Nie wiem, wolałem zrobić tak jak jest w oryginale, te same piny portu czyli bity 0 i 1. Mógłbyś pokazać jak to zrobić?

    Hmmm... zawile to napisałem :D , chodzi o to ażeby D+ podłączyć tylko do portu PD2 (int0) ,wtedy zwolni ci się jeden pin. Zobacz na obrazek Na górze mój, na dole twój aktualny układ :) .

    Zrozumiałem, ale nie wiem co należy zmienić w kodzie aby to działało jak trzeba. Z resztą wolny pin mi nie potrzebny a i tak one są obok siebie więc bez róznicy.
    saper_2 napisał:

    PS. Jeśli znajdę jakąś m8 w dipie w domu to może w piątek potestuję u siebie jak to działa...

    W zasadzie to nie jest dla mnie, ale już wiele osób się pytało o wersję przewlekaną lcd2usb więc po prostu chciałem przerobić i udostępnić wraz ze źródłem, więc jeśli byś mógł rzucić okiem to by było super ;) Ja teraz nie mam czasu na takie zabawy :(
  • REKLAMA
  • Pomocny post
    #7 8527493
    11111olo
    Poziom 42  
    Manekinen też miałem ten problem i jak się okazało nie można sobie ot tak dowolnie podłączyć linii D+ i D-.

    D- MUSI być na zerowym pinie portu np. D0, C0...
    D+ na INT0 (D2) i na innym pinie tego samego portu co D-
    np. D- na D0, D+ na D1 i D2.

    Chyba wszystko jasne.
  • #8 8930099
    manekinen
    Poziom 29  
    11111olo napisał:
    nie można sobie ot tak dowolnie podłączyć linii D+ i D-.

    D- MUSI być na zerowym pinie portu np. D0, C0...
    D+ na INT0 (D2) i na innym pinie tego samego portu co D-
    np. D- na D0, D+ na D1 i D2.

    Rozwiązanie problemu.

    Dzięki wszystkim, zamykam :)
REKLAMA