Forum: Mikrocontroller und Digitale Elektronik Atmega88 USART


von LC-HC (Gast)


Lesenswert?

Hi,

nachdem sich nun das Problem mit den Interrupts gelöst hat, macht der 
USART nun nicht das, was er soll.
ICh möcht ezu beginn nur mal alle x-sek. ein Zeichen ausgeben. Leider 
kommt aber am Terminal nichts, bzw. nur ab un dzu fehlerhafte zeichen 
an. Auf dem Oszi betrachtet, werden aber richtige Zeichen mit der 
korrekten Baudrate verschickt. Jetzt wird der geneigte Btrachter sagen, 
dass die serielle Schnittstelle defekt wäre, ist sie aber nicht. 
getestet. Vielleicht ist es wieder eine dieser kleinigkeiten, über die 
ich immer stolpere. Den Code habe ich nochmal gepostet. Vielleicht hat 
jemand ja Anregungen oder tips ?
1
//uart0.c
2
3
4
5
6
7
#include <avr/io.h>
8
#include <avr/interrupt.h>
9
10
11
#define myBRR0 51 // BAUDRATE 9600 bps
12
13
volatile unsigned char i = 0;
14
volatile unsigned char rxFlag = 0;
15
unsigned char rxCh; 
16
17
void Uart0Init(void);
18
void putc(unsigned char ch);
19
void puts(unsigned char *str);
20
21
void Timer0(unsigned char time);
22
23
24
ISR( TIMER0_OVF_vect )
25
{
26
  
27
}
28
29
ISR( USART_RX_vect )
30
{
31
  rxCh = UDR0;
32
  putc(rxCh);
33
}
34
35
36
37
38
39
void main(void)
40
{
41
  
42
  //STATUS LEDs
43
  DDRC = (1<<5);
44
  DDRB = (1<<7);
45
  
46
  //POWER REDUCTION REGISTER
47
  PRR = (1<<7) | (1<<2) | (1<<0);
48
  
49
  Uart0Init();
50
  
51
    
52
  sei(); // Interrupts einschalten
53
  
54
  
55
  Timer0(0);
56
  
57
  for(;;)
58
  {    
59
    
60
      while( !( TIFR0 & (1<<TOV0) ) )
61
        ;
62
    
63
      
64
      while( !( UCSR0A & (1<<UDRE0) ) ) 
65
        ;
66
      UDR0 = 'a';
67
      
68
  }
69
  
70
}
71
72
73
74
75
76
void Uart0Init(void)
77
{
78
  
79
80
    UBRR0H = (unsigned char)(myBRR0 >> 8);
81
    UBRR0L = (unsigned char)myBRR0;
82
    
83
    UCSR0B = (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0);
84
    
85
    UCSR0C = (3<<UCSZ00);  // 8-Bit Charaktersize
86
    
87
  
88
}
89
90
91
void puts(unsigned char *str)
92
{
93
  while(*str)
94
  {
95
    putc(*str);
96
    str++;
97
  }
98
}
99
100
101
102
void Timer0(unsigned char time)
103
{
104
  //time = vielfaches von 0,128ms
105
  /* time Lookuptable der aktueller Konfiguration 19.03.07
106
    time 0.. - 255
107
    00 = 0,00 ms
108
    10 = 1,28 ms
109
    20 = 2,56 ms
110
    30 = 3,84 ms
111
    40 = 5,12 ms
112
    50 = 6,40 ms
113
    ...
114
  */
115
  
116
  
117
  TCNT0 = 128;
118
  TIMSK0  |= (1 << TOIE0);         // Timer 0 Overflow Interrupt
119
  TCCR0B = (1<<CS01) | (1<<CS00);   // Teiler 1024  
120
  
121
  
122
}

mfg,

Simon

von Falk (Gast)


Lesenswert?

@LC-HC

>ICh möcht ezu beginn nur mal alle x-sek. ein Zeichen ausgeben. Leider
>kommt aber am Terminal nichts, bzw. nur ab un dzu fehlerhafte zeichen
>an. Auf dem Oszi betrachtet, werden aber richtige Zeichen mit der
>korrekten Baudrate verschickt.

Ist im Terminalprogramm die richtige Baudrate eingestellt?

MFG
Falk

von A.K. (Gast)


Lesenswert?

> Auf dem Oszi betrachtet, werden aber richtige Zeichen mit
> der korrekten Baudrate verschickt.

Daraus muss man ja wohl den Schluss ziehen, dass das Problem nicht beim 
Microcontroller liegt, oder?

von Stefan W. (wswbln)


Lesenswert?

...welche Taktquelle verwendet der Controller (interner RC oder Quarz)?

von Uwe .. (uwegw)


Lesenswert?

Guckst du mit dem Oszi auf der TTL-Seite am AVR oder auf der +-12V-Seite 
hinter dem Pegelwandler?

von LC-HC (Gast)


Lesenswert?

HI, danke für die antworten. Die DAten liegen sowohl am TTL, als auch 
zwischen Treiber und PC in gleicher Form an. Da ich aber noch nebenbei 
mit einem M16C arbeite und der ohne Probleme seine Debuganweisungen 
ausgibt, kanns der PC nicht sein. Der µC verwendet den internen 8Mhz 
Takt.

von johnny.m (Gast)


Lesenswert?

> Der µC verwendet den internen 8Mhz Takt.
Und genau da könnte das Problem liegen...

von Uwe .. (uwegw)


Lesenswert?

Teste mal den RS232-Treiber, indem du auf seiner TTL-Seite RX und TX 
verbindest (den AVR aus der Fassung nehmen und nen Draht in die Fassung 
stecken) und vom PC aus sendest.

Wenn die Daten dann korrekt zum PC zurückkommen: Treiber in Ordnung, 
Fehler beim AVR. Ansonsten kann der Fehler auch im Treiber liegen.

von LC-HC (Gast)


Lesenswert?

Ok, Problem gelöst !? Es lag am Kabel. Der M16C ließ sich jedoch mit dem 
selben Kabel ohne Probleme lesen und flashen ... ?

Danke nochmal !

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.