Komischer Fehler beim hintereinander aufrufen von einer Funktion

Gast #942445
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
}
Gast #942499
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren