- LiFePO4 Speicher Test         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 28 von 28

Thema: USART Komplikationen

  1. #21
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hopperla, mit deinem Init hat's was
    wenn du usart_init aufrufst mit (READ + WRITE, ...
    kannst du nicht auf Enable == READ abfragen
    du mußt if(Enable & READ) fragen
    mfg robert

  2. #22
    Ok, nun hab ich die init umgeschrieben:
    Code:
    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;
    }
    Aber das Resultat war noch nicht zufriedenstellend, daher hab ich in die SIGNAL noch folgendes reingepackt:
    Code:
    	usart_writeChar('[');
    	usart_writeChar(data);
    	usart_writeChar(']');
    Man soll zwar net im Interupt wieder schreiben, aber naja....

    Resultat is jedenfalls folgendes:
    Hello World[H][e][r][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[]...
    Hmm

    Warum muss man das egtl mit & verbinden und kann net mit == vergleichen?
    Und muss ich dann vllt in der 3ten iif (Enable & WRITE & READ) schreiben?

  3. #23
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Hi, den jeweils dritten "if" soltest du entfernen.
    Unterschied & und ==
    Beim Aufruf init (READ + WRITE
    steht bei enable offensichtlich "3" drin
    das ist weder == 1 (READ) noch == 2 (WRITE) also nix.
    Mittels "&" fragst du das bit ab, also 00000001 oder 00000010

    Schaut fast so aus, als würde dein Senden den receive interrupt auslösen.
    und im EMpfangsregister steht, so scheint's, immer "[" drin
    Kannst du mal dein komplettes Programm im jetzigen Zustand posten ?
    mfg robert

  4. #24
    Wenn aber Enable == 3 wäre, sollte doch die dritte if (Enable = READ + WRITE) anspringen oder?

    Hier der momentane Code (Die ifs hab ich erstmal drin gelassen)
    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;
    volatile int changed;
    
    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;
    	while(!(UCSRA & (1<<TXC))) {}
    }
    
    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;
    	changed = 1;
    	usart_writeChar('[');
    	usart_writeChar(data);
    	usart_writeChar(']');
    }
    
    int main (void)
     {
     usart_init( (READ + WRITE) , READ);
      DDRD  = 0xFF;
      PORTD = 0x00;  
      changed = 0;
      usart_writeString("Hello World");
      sei();
      
     
     while (1)
      {
       if (changed == 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);
         changed = 0;
    	}
      }
     }

  5. #25
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ich zieh mir mal den Code rein.
    Mit deinem dritten "if" hast du nicht ganz unrecht, aber auf diese art mußt du 4 Möglichkeiten "ifen"
    1Nix
    2Read
    3Write
    4Read + Write
    Stell die mal vor, du hättest 3 Parameter, dann hast du 8 if's.
    Also, ich laß mal nachdenken mfg derweil robert

  6. #26
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Also Kollege, da ist mal der Code zurück, als Attachment.
    Bei mir auf einem RNBFRA 1.2 läuft das Zeugs pipifein, keine Loops
    Ein Input --> Ein Output
    allerdings extern 8MHZ, das wollt ich mir nicht antun

    1 den berühmten dritten "if" hab ich geschmissen,
    2 volatile auf static (das ist aber wurst, geht beides)
    3 changed auf Byte (das reicht, is aber egal )
    4 Daten vor dem vergleich auf kleinbuchstaben (damit man "R"/"r"
    gleichermaßen eingeben kann)
    5 eine paar "newlines" eingefügt, besser zum Lesen

    aber im Prinzip ist es völlig dein Programm.

    Also wenn was nicht geht, liegt der Fehler NICHT im Programm, sondern irgendwo drumherum.
    Halte dir die Version warm und arbeite auf einer Kopie weiter.
    Laß hören ! mfg robert
    Angehängte Dateien Angehängte Dateien

  7. #27


    Dein Code ging nun auch nicht und dann hab bin ich nochmal alles mit dem Multimeter durchgegangen...
    Ergebnis:
    Von einem Litz - ich glaube TX - am µC war ein einzelner Strang außen geblieben und hat sich beim reinschieben umgebogen. Und irgendwie is der dann an den entsprechenden RX Pin gekommen.




    Wie blöd -.-

    Auf jeden Fall vielen Dank, Robert...
    Hast mir sehr geholfen

    MfG
    Alex

  8. #28
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Is immer wieder toll, wenn man nach ein paar verzweifelten Tagen auf solche banalen Fehler draufkommt. Was man sich da denkt, sollte besser keiner wissen. Also, auf zum Nächsten ! mfg robert

Seite 3 von 3 ErsteErste 123

Berechtigungen

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

12V Akku bauen