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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.