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


von Mr. Master (Gast)


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...
1
int main(void)
2
{
3
  uint16_t temp=0;
4
  uint8_t empfang, lsb, msb;
5
  
6
  //Initialisierung Ports
7
8
  DDRB = (1<<DDB0)|(1<<DDB1)|(1<<DDB2)|(1<<DDB6)|(1<<DDB7);   
9
  PORTB|=(1<<PB1)|(1<<PB2);                  //RS485 Receiver und Max6675 ausschalten
10
  PORTB|=(1<<PB5)|(1<<PB7);   //Pull Up an DI aktiv, SPI Clock auf high
11
  PORTB &=~(1<<PB0);      //RS485 Transimtter ausschalten, MAX6675 nicht auslesen
12
    
13
  
14
  //USART Intitalisierung
15
  USART_Init(baudrate);
16
  
17
  for(uint8_t i=0; i<=2; i++)
18
  {
19
        for(uint8_t i=0; i<=100; i++)
20
           _delay_ms(50);
21
  
22
23
        temp=SPI_Receive();  
24
        eeprom_write_word(&max, temp);
25
        msb=temp;
26
        lsb=(temp>>8);
27
        eeprom_write_byte(&elsb, lsb);
28
        eeprom_write_byte(&emsb, msb);
29
        //PORTB|=(1<<PB0);               //selbst das Setzen und löschen von PB0 ausherhalb der Funktion behebt den Fehler nicht! ??
30
        USART_Transmit(msb);
31
        USART_Transmit(lsb);
32
        //PORTB&=~(1<<PB0);
33
  }
34
  while(1);
35
  return 0;
36
}
37
38
39
40
41
void USART_Transmit( unsigned char data )
42
{
43
  PORTB |=(1<<PB0);          //RS485 Transmitter An
44
  /* Wait for empty transmit buffer */
45
  while ( !( UCSRA & (1<<UDRE)) );
46
  /* Put data into buffer, sends the data */
47
  UDR = data;
48
  while ( !( UCSRA & (1<<UDRE)) );
49
  PORTB &=~(1<<PB0);          //RS485 Transmitter Aus
50
51
}

von Andreas K. (a-k)


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.

von Mr. Master (Gast)


Lesenswert?

Ah OK,
stimmt hab jetzt folgendes gemacht und es funktioniert:
1
void USART_Transmit( unsigned char data )
2
{
3
  PORTB |=(1<<PB0);          //RS485 Transmitter An
4
  /* Wait for empty transmit buffer */
5
  while ( !( UCSRA & (1<<UDRE)) );
6
  /* Put data into buffer, sends the data */
7
  UDR = data;
8
  while ( !( UCSRA & (1<<TXC)) );
9
  UCSRA |=(1<<TXC);
10
  PORTB &=~(1<<PB0);          //RS485 Transmitter Aus
11
12
}

Danke!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.