Forum: Compiler & IDEs Mega88 - Mal wieder UART


von Daniel Goßmann (Gast)


Lesenswert?

Hallo!

Ich hatte auf dem Mega8515 nie Probleme mit dem UART, aber nun gehts 
los:

Auf einem Steckbrett steckt ein Mega88. Als Takt dient ein 
Quarzoszillator mit 12 MHz (Fuses beachtet, mit _delay_ms(1000) passt 
die Geschwindigkeit auch).
Vom PD1 gehts über den Pegelwandler des STK500 zum RS232 Umsetzer des 
PCs. (Port umgesteckt -> SPARE).
An PD1 (TxD) hängt parallel eine LED zur Kontrolle des Pegelwechsels mit 
Vorwiderstand an GND, an PC5 hängt eine LED mit Vorwiderstand an VCC.

Mein Code, WinAVR-Version: 20090313
1
#include <avr/io.h>  
2
3
int main (void) {    
4
   
5
   DDRC = 0xFF ; // All out
6
   #define BAUD 9600
7
   #include <util/setbaud.h>
8
   UBRR0H = UBRRH_VALUE;
9
   UBRR0L = UBRRL_VALUE;
10
   #if USE_2X
11
   UCSR0A |= (1 << U2X0);
12
   #else
13
   UCSR0A &= ~(1 << U2X0);
14
   #endif
15
16
    // Enable transmitter 
17
    UCSR0B = (1<<TXEN0);
18
    // Set frame format: 8data, 1stop bit
19
    UCSR0C =  (1<<UCSZ01)|(1<<UCSZ00);  
20
  
21
  while(1) {
22
  
23
    // Wait for empty transmit buffer
24
    while (!(UCSR0A & (1<<UDRE0))){
25
      
26
      // In diese Schleife wird nur 1x gesprungen
27
      
28
      // Put data into buffer, sends the data
29
      UDR0 = 0x55 ;
30
      
31
      PORTC ^= (1<<PC5) ; // Test LED
32
    } ;
33
  } ;
34
 } ;

Nun scheint es so, als wenn das UDR nur einmal beschrieben wird, 
zumindest wird die Schleife nur einmal durchlaufen (mit AVR-Studio 
getestet). Die LED am TxD-Port PD1 geht dauer an, geht aber nicht wieder 
aus, auch kein Flackern.
Die LED an PC5 bleibt ebenso dauer an, kein Flackern.

Jemand eine Idee die Tomaten auf meinen Augen weg zu pulen?

Gruß
Daniel

von Stefan E. (sternst)


Lesenswert?

1
   while (!(UCSR0A & (1<<UDRE0))){
2
      UDR0 = 0x55 ;
3
      PORTC ^= (1<<PC5) ;
4
    } ;
->
1
   while (!(UCSR0A & (1<<UDRE0))){
2
   }
3
   UDR0 = 0x55 ;
4
   PORTC ^= (1<<PC5) ;

von Daniel Goßmann (Gast)


Lesenswert?

Arrrgh! Super, Danke!

Daniel

von Patrick B. (p51d)


Lesenswert?

Daniel Goßmann schrieb:
>
1
> #include <avr/io.h>
2
> 
3
> int main (void) {
4
> 
5
>    DDRC = 0xFF ; // All out
6
>    #define BAUD 9600
7
>    #include <util/setbaud.h>
8
>
sorry aber was hat hier ein PRÄprozessor zu suchen??
würd ich so machen:
1
#include <avr/io.h>
2
#include <util/setbaud.h>
3
#define BAUD 9600
4
5
6
int main (void) {
7
   DDRC = 0xFF ; // All out
Du musst dir vorstellen wenn der code mal gewartet werden soll (aus 
irgend einem Grund z.B umschreiben auf anderen Prozessor), dann viel 
Spass beim ändern. So hast du alles schön in den ersten paar Zeilen 
deklariert.
Kriegt der Combiler so nicht auch ein Problem??


>
1
>   while(1) {
2
> 
3
>     // Wait for empty transmit buffer
4
>     while (!(UCSR0A & (1<<UDRE0))){
5
> 
6
>       // In diese Schleife wird nur 1x gesprungen
7
> 
8
>       // Put data into buffer, sends the data
9
>       UDR0 = 0x55 ;
10
> 
11
>       PORTC ^= (1<<PC5) ; // Test LED
12
>     } ;
13
>   } ;
14
>  } ;     
15
>
Schöne Semikolons nach den Struckturblöcken, aber diese brachts nicht.
1
while(1){
2
  // mach was
3
}

von Patrick B. (p51d)


Lesenswert?

oh, hab noch was entdeck:
1
> #include <avr/io.h>  
2
> // .....
3
> int main (void) {     
4
>   
5
>   while(1) {
6
>     while (!(UCSR0A & (1<<UDRE0))){
7
>       // ...
8
>     } ;
9
>   } ;
10
>  } ;
11
>
deine main-Funktion kann so nicht funktionieren: sollte zumindest eine 
Fehlermeldung kommen (" wrong function type or missing return")
1
int main(void){
2
// ....
3
   while(1){
4
      //....
5
   }
6
return 0;
7
}

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.