Mega88 - Mal wieder UART

Gast #1509634
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
#1511151
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
}
#1511285
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
}

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