- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 28

Thema: USART Komplikationen

  1. #11
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Zum Schaltplan:
    Eigentlich gibt's keinen, ich hab mich durch Tutorials und ähnliches gewühlt und bissel kombiniert
    Zwar hatte ich immer irgendwelche kleinen Probleme, aber bisher konnte ich das alles immer lösen und hab dementsprechend viel über die "Materie" gelernt.
    Das woran ich bastel, soll nur ne Experimentierstation sein, für mein richtiges Projekt mach ich mir nen richtigen Schaltplan.

    Naja zum Problem: Ich glaube es liegt irgendwie am Quarz, denn gerade eben habe ich wieder auf den Internen geschaltet und der klappt wunderbar. Da kann ich mit dem Pony auch dann coden, wenn LCD & USART dranhängen...

    Letzens hab ich meinen µC mit nem Kurzschluss gef***t, vllt is der Quarz auch hinüber?
    Ich denk egtl nicht, denn auch damals hatte ich die Fusebits net auf externen Quarz gestellt...

  2. #12
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Würde mich auch wundern, wenn man einen Quarz so meucheln könnte, aber nix is fix.
    Was du erzählst, klingt mir schon sehr elektrisch und weniger softwarig
    Ein Unterschied extern /intern is natürlich schon : 8 Mhz stellen an Leitungskapazitäten, Überspruch etc. ganz andere Anforderungen als 1 Mhz.
    Hast du alle Chips, speziell den AVR, mit Kondensatoren versehen ?
    Ideal wär ja, einen externen mit ca 1 MHZ zu probieren, ob's am Externen oder an der Taktrate liegt. *leichtratlos* mfg robert

  3. #13
    hmm, dann muss ich mir heute noch nen Externen 1Mhz Takt kaufen :-/

    Also am AVR hab ich nen Kondensator, auf meinem Dongle auch.
    Im Schaltplan vom USART wird das mit nem Elko gelöst, nur am LCD hab ich keinen, hab aber auch keinen Plan gesehn, auf dem das gezeigt wurde...

    Kann man die denn zu weit weg platzieren oder so?

  4. #14
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Kann man schon, im Prinzip zählt jeder Zentimeter. mfg

  5. #15
    Hmm, ich hab gerad mal das Datasheet vom ATmega16 durchstöbert und folgendes gefunden:
    The Calibrated Internal RC Oscillator provides a fixed 1.0, 2.0, 4.0, or 8.0 MHz clock. [...]
    Table 9. Internal Calibrated RC Oscillator Operating Modes
    <pre>
    CKSEL3..0 Nominal Frequency (MHz)
    0001 1.0
    0010 2.0
    0011 4.0
    0100 8.0
    </pre>
    Also hab ich mal CLSET3..1 auf 0100 (Wobei 0 = programmed und 1 = unprogrammed) gestellt.

    Resultat: Der µC scheint stabil zu laufen, lässt sich bisher programmieren und mein Terminal empfängt wieder fleißig "Hello World"

    Scheinbar lag es doch am externen Quarz und nicht an der Taktrate...
    (Hoffentlich) eine letzte abschließende Frage:
    Warum benutzt man denn nen externen Quarz, wenn der interne bis auf 8 MHz kommt? (Es sei denn man will mit 16MHz arbeiten)

    Und die Frage zu gestern: Kann sich jmd erklären, wie es der µC geschafft hat, von selbst die Fusebits wieder zurückzustellen?

    MfG
    Alex

  6. #16
    Hi zusammen,
    so richtig will's immernoch nicht klappen...
    Das Schreiben scheint zu klappen, aber ich hab echt das Gefühl, dass der µC nicht mit dem Lesen klar kommt.

    Folgender Code:
    Code:
    #include <inttypes.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    
    #define Pin1 0
    #define Pin2 1
    #define Pin3 2
    #define Pin4 3
    #define Pin5 4
    #define Pin6 5
    #define Pin7 6
    #define Pin8 7
    
    #define READ  1
    #define WRITE 2
    
    #define F_CPU 8000000
    #define USART_BAUD_RATE 9600
    #define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16l)-1)
    
    volatile unsigned char data;
    
    void usart_init(int Enable, int Interupts) {
        if (Enable == READ)         UCSRB = (1<<RXEN);
    	if (Enable == WRITE)        UCSRB = (1<<TXEN);
    	if (Enable == READ + WRITE) UCSRB = ( (1<<RXEN) | (1<<TXEN) );
    
        if (Interupts == READ)         UCSRB |= (1<<RXCIE);
    	if (Interupts == WRITE)        UCSRB |= (1<<TXCIE);
    	if (Interupts == READ + WRITE) UCSRB |= ( (1<<RXCIE) | (1<<TXCIE) );
    	
        UBRRL = (unsigned char) USART_BAUD_SELECT;
    }
    
    void usart_writeChar(unsigned char c) {
    	while (!(UCSRA & (1<<UDRE))) {}
    	UDR = c;
    }
    
    unsigned char usart_readChar(void) {
        while(!(UCSRA & (1<<RXC))) {}
        return UDR;
    }
    
    void usart_writeString(unsigned char *string) {
        while (!(UCSRA & (1<<UDRE))) {}
    	while ( *string)
    		usart_writeChar(*string++);
    }
    
    SIGNAL (SIG_UART_RECV) {		
    	data = UDR;
    }
    
    int main (void)
     {
     usart_init(READ + WRITE, READ);
      DDRD  = 0xFF;
      PORTD = 0x00;  
      usart_writeString("Hello World");
      sei();
     
     while (1)
      {
      	if (data == 'l')
         {
         PORTD = (1 << Pin6);
         usart_writeString("[Motor left]");
        }
       else if (data == 'r')
        {
         PORTD = (1 << Pin7);
         usart_writeString("[Motor right]");
        }
       else if (data == 's')
        {
         PORTD = 0x00;
         usart_writeString("[Motor stop]");
        }
       else usart_writeChar(data);
      }
     }
    Folgende Ausgabe auf dem Terminal:
    Hello World[Motor right]ht]ht]ht]ht]ht]ht]ht]ht]ht]ht]ht]ht]ht]ht]ht]ht]ht]ht]ht]ht]ht]ht]ht]
    ...
    Das seltsame ist, dass ich über das Terminal gar nichts schicke, was das USART empfangen könnte.
    Trotzdem wird die IF Schleife (data == 'r') ausgelöst, dabei kann data gar nicht 'r' sein

  7. #17
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Kollege, es is ja keiner da, der "data" zurücksetzt, wenn kein UDR kommt.

    Beim senden tät ich
    warten, bis register leer (machst du)
    reinschreiben
    warten, bis senden fertig (TXC) sicherheitshalber
    mfg robert

  8. #18
    Das stimmt zwar, aber data wird ja nie ein Wert zugewiesen, daher sollte der ja nicht in die if schleife springen, daran kann's also nicht liegen...

    Nun habe ich den Code erweitert:
    Code:
    //...
    volatile unsigned char data;
    volatile int changed;
    
    //...
    
    void usart_writeChar(unsigned char c) {
    	while (!(UCSRA & (1<<UDRE))) {}
    	UDR = c;
    	while(!(UCSRA & (1<<TXC))) {}
    }
    
    //...
    
    SIGNAL (SIG_UART_RECV) {		
    	data = UDR;
    	changed = 1;
    }
    
    //...
    
    int main (void)
     {
    //...
      changed = 0;
      sei();
    //...
     while (1)
      {
       if (changed == 1)
        {
      	 if (data == 'l')
          {
    //...     
          }
         else usart_writeChar(data);
         changed = 0;
    	}
      }
     }
    Trotzdem wird der Motor eingeschaltet und das Terminal empfängt dasselbe wie oben. Dabei schicke ich doch gar nichts ab...

  9. #19
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Seltsam. Es sind immer die drei zeichen "ht]" die er wiederholt ?
    Oder ist "ft]", wenn du "l" schickst ? mfg

  10. #20
    kA, denn er reagiert nicht, wenn ich ihm was schicke...
    Das hab ich vergessen zu erwähnen:

    Wenn ich was sende wird die SIGNAL - Routine gar nicht aufgerufen...

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen