www.mikrocontroller.net

Forum: Compiler & IDEs Komischer Fehler beim hintereinander aufrufen von einer Funktion


Autor: Mr. Master (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich habe ein Problem mit meiner USART_Transmit() Funktion.
Und zwar will ich dass wenn die Funktion aufgerufen wird der PB0 auf '1' 
geht und am Ende der Funktion wieder auf '0' geht.

Wenn ich also die Funktion zweimal hintereinfander aufrufe sollte der 
PB0 fast durchgehend auf '1' liegen. Aber aus irgendwelchem Grund geht 
der PB0 nach dem ersten aufrufen der Funktion wieder auf '0' und bleibt 
selbst beim zweiten Aufruf '0'!
Selbst wenn ich das setzen und löschen ausheralb der Funktionen (in 
Main) vornehme, bleibt der Fehler
Vielleicht seh ich den Wald vor lauter Bäumen nicht mehr...
int main(void)
{
  uint16_t temp=0;
  uint8_t empfang, lsb, msb;
  
  //Initialisierung Ports

  DDRB = (1<<DDB0)|(1<<DDB1)|(1<<DDB2)|(1<<DDB6)|(1<<DDB7);   
  PORTB|=(1<<PB1)|(1<<PB2);                  //RS485 Receiver und Max6675 ausschalten
  PORTB|=(1<<PB5)|(1<<PB7);   //Pull Up an DI aktiv, SPI Clock auf high
  PORTB &=~(1<<PB0);      //RS485 Transimtter ausschalten, MAX6675 nicht auslesen
    
  
  //USART Intitalisierung
  USART_Init(baudrate);
  
  for(uint8_t i=0; i<=2; i++)
  {
        for(uint8_t i=0; i<=100; i++)
           _delay_ms(50);
  

        temp=SPI_Receive();  
        eeprom_write_word(&max, temp);
        msb=temp;
        lsb=(temp>>8);
        eeprom_write_byte(&elsb, lsb);
        eeprom_write_byte(&emsb, msb);
        //PORTB|=(1<<PB0);               //selbst das Setzen und löschen von PB0 ausherhalb der Funktion behebt den Fehler nicht! ??
        USART_Transmit(msb);
        USART_Transmit(lsb);
        //PORTB&=~(1<<PB0);
  }
  while(1);
  return 0;
}




void USART_Transmit( unsigned char data )
{
  PORTB |=(1<<PB0);          //RS485 Transmitter An
  /* Wait for empty transmit buffer */
  while ( !( UCSRA & (1<<UDRE)) );
  /* Put data into buffer, sends the data */
  UDR = data;
  while ( !( UCSRA & (1<<UDRE)) );
  PORTB &=~(1<<PB0);          //RS485 Transmitter Aus

}

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
UDRE signalisiert nur, dass eines der Pufferregister frei ist, nicht 
jedoch dass die Übertragung komplett durch ist. Den Transceiver darfst 
du aber erst abschalten, wenn alles raus ist. Siehe dazu TXC.

Autor: Mr. Master (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah OK,
stimmt hab jetzt folgendes gemacht und es funktioniert:
void USART_Transmit( unsigned char data )
{
  PORTB |=(1<<PB0);          //RS485 Transmitter An
  /* Wait for empty transmit buffer */
  while ( !( UCSRA & (1<<UDRE)) );
  /* Put data into buffer, sends the data */
  UDR = data;
  while ( !( UCSRA & (1<<TXC)) );
  UCSRA |=(1<<TXC);
  PORTB &=~(1<<PB0);          //RS485 Transmitter Aus

}

Danke!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.