Forum: Mikrocontroller und Digitale Elektronik UART sendet+empfängt nicht / Atmega8, C++ Programm


von Matthias (Gast)


Lesenswert?

Hallo,

Ich habe eine kleine Platine mit Atmega8, der Atmega wird mit 2 
Interrupts für den Empfang/Senden von Daten konfiguriert.

Mit dem Oszi kann ich sehen, dass Daten am RX-Pin eingehen. Ebenso 
überwache ich den TX-Pin.

Leider schaffe ich es nicht dass er etwas sendet oder Empfängt, beide 
Interrupts schneinen niemals auszulösen...

Da dieser Code mit einem Atmega1284 problemlos funktioniert und ich den 
entscheidenden Fehler/Unterschied in der Konfiguration im 
Atmega8-Datenblatt und auch beim Vergleich der Datenblätter nicht sehe 
bin ich überfragt...

Er hat auch ein LCD-Display auf welchem das "E" geschrieben wird.
Jedoch kommt er nicht zum F.

Vielleicht habt ihr eine Idee?
1
static char TxBuff[32];
2
static char RxBuff[32];
3
4
static volatile uint8_t RxRead = 0;  // Zeigt auf Zeichen, das gesendet werden soll
5
static volatile uint8_t RxWrite =0;  // Zeigt auf nächste Schreibposition im Puffer
6
7
static volatile uint8_t RxLen =0;  // Zeigt auf nächste Schreibposition im Puffer
8
9
static volatile uint8_t TxRead = 0;  // Zeigt auf Zeichen, das gesendet werden soll
10
static volatile uint8_t TxWrite =0;  // Zeigt auf nächste Schreibposition im Puffer
11
12
int main(void)
13
{
14
  uint8_t a=0x04;
15
  uint8_t b=0x05;
16
  char* addr;
17
  uint8_t len=0;
18
  
19
  _delay_ms(1000);
20
  
21
  InituC();
22
  LCD_init();
23
24
    while(1)
25
    {
26
    _delay_ms(10);
27
    UART_HMI_PutC('l');
28
        addr=UART_HMI_GetRec(len);
29
    LCD_Send('E');
30
        if (len>0)
31
        {
32
      LCD_Send_ADDR(a);
33
      LCD_Send('F');
34
          for(int i=0;i<len;i++)
35
          {
36
            UART_HMI_PutC(addr[i]);
37
        LCD_Send_ADDR(b);
38
            LCD_Send('Z');
39
          }
40
        }
41
    }
42
}
43
44
void InituC()
45
{
46
  DDRD = 0x02;   //TXD = O
47
  //PORTD |= 0x3E; // Pull-UP SW4--SW0
48
  DDRC = 0x3F;   //(D4 = O,D5 = O,D6 = O,D7 = O,GP5 = I,GP6 = I,RS = O,E = O)
49
  DDRB = 0x00;   //(BEL = I, GP3 = I ,GP4 = I,MOSI = I,MISO = I,SCK = I)
50
  sei();         //Global IRQ-Enable
51
  //Timer0_Init();
52
  _delay_ms(20);
53
}
54
55
void UART_HMI_Init()
56
{
57
58
  UCSRA&=0xFC;      //U2X=0, kein MCPM
59
  UCSRB=0x98;      //RX/TX-Enable, IRQ-Enable
60
  UBRRH=0x00;
61
  UCSRC=0x86;      //8Bit, Kein Parity, ein Stop
62
  UBRRL=0x33;      // Baud-Rate @8MHz = 1200Baud
63
}
64
65
void UART_HMI_PutC(char data)
66
{
67
  while(TxWrite != TxRead);        // Warte bis Platz im Puffer
68
  TxBuff[TxWrite++] = data;
69
  if(TxWrite >= 32) TxWrite = 0;
70
  UCSRB |= (1<<UDRIE);          // UDRE Interrupt ein
71
}
72
73
char* UART_HMI_GetRec(uint8_t& len)
74
{
75
  char* pointer;              //Rückgabe der Aktuellen Addresse
76
  UCSRB &= ~(1<<RXCIE);          //Disable RX-IRQ
77
  len = RxLen;              //return actual length of readable bytes
78
  RxLen=0;                //Length of readable Bytes = 0
79
  uint8_t RxRead_buff=RxRead;        //Get last Read-Addr, wich beginns with 1. Byte, that has not been Read last Time
80
  RxRead=RxWrite;              //Set actual rx-Addr to wr-Addr --> 0 Bytes in Buffer
81
  UCSRB |= (1<<RXCIE);          //Enable RX-IRQ
82
  return pointer = &RxBuff[RxRead_buff];  //Return Pointer to 1. Readable Byte
83
}
84
85
ISR(USART_RXC_vect)      //Wartet auf ein erstes Zeichen des PC's
86
{
87
  UART_HMI_PutC('L');
88
  UCSRB &= ~(1<<RXCIE);
89
  RxBuff[RxWrite++] = UDR;
90
  if(RxWrite >= 32 ) RxWrite = 0;
91
  RxLen=RxLen + 1;
92
  UCSRB |= (1<<RXCIE);
93
}
94
95
ISR(USART_UDRE_vect)
96
{
97
  if(TxRead == TxWrite) UCSRB &= ~(1<<UDRIE);      // UDRE Interrupt aus
98
  else {
99
    UDR = TxBuff[TxRead++];              // nächtes Zeichen aus Puffer senden
100
    if(TxRead >= 32) TxRead = 0;
101
  }
102
}


Wäre toll wenn jemand da eine Idee hätte ;)

von Oliver S. (oliverso)


Lesenswert?

Schreib die ganzen magic numbers mal mit Bitnamen.
Ein wesentlicher Unterschied zwischen den Prozessoren ist das handling 
von UCRSB/C.

Oliver

von S. Landolt (Gast)


Lesenswert?

Wo wird dieses UART_HMI_Init denn aufgerufen?

von OMG (Gast)


Lesenswert?

Matthias schrieb:
> void UART_HMI_Init()
> {
>
>   UCSRA&=0xFC;      //U2X=0, kein MCPM
>   UCSRB=0x98;      //RX/TX-Enable, IRQ-Enable
>   UBRRH=0x00;
>   UCSRC=0x86;      //8Bit, Kein Parity, ein Stop
>   UBRRL=0x33;      // Baud-Rate @8MHz = 1200Baud
> }


Soll das ein Witz sein mit deinen Magic Numbers? Da darf sich
jeder der Lust hast sich seine Bits raussuchen um zu sehen ob
du es richtig machst? Weil du zu faul bist es dem Hilfeanbieter
leicht zu machen durchzublicken?

Dann noch dies hier:

---------------------------------------------
Wichtige Regeln - erst lesen, dann posten!

.................
    Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
---------------------------------------------

von Stefan F. (Gast)


Lesenswert?

Probiere erst mal ein einfacheres Programm ohne ISR aus, um 
Hardwarefehler und falsche Taktfrequenz/Bitrate auszuschließen.

von Matthias (Gast)


Lesenswert?

S. Landolt schrieb:
> Wo wird dieses UART_HMI_Init denn aufgerufen?

Dass wird es wohl sein :)

Ja, das ist es :-)

Vielen Dank ;-)

OMG schrieb:
> Soll das ein Witz sein mit deinen Magic Numbers? Da darf sich
> jeder der Lust hast sich seine Bits raussuchen um zu sehen ob
> du es richtig machst? Weil du zu faul bist es dem Hilfeanbieter
> leicht zu machen durchzublicken?

Nun, ich habe den Aufwand betrieben alle Bits 2mal auf ihre Richtigkeit 
zu Pürfen. Wenn du, wie du es selbst schreibst, zu faul bist dir diesen 
Aufwand zu machen sehe ich es nicht als mein Problem an.

von Stefan F. (Gast)


Lesenswert?

Matthias schrieb:
> Wenn du, wie du es selbst schreibst, zu faul bist dir diesen
> Aufwand zu machen sehe ich es nicht als mein Problem an.

Wen dir deswegen keiner hilft, wird es aber wiederum dein Problem.

Das ist hier ja schon eine Form von Teamarbeit. In Teams muss man sich 
auf einen gemeinsamen Stil einigen, um erfolgreich zusammen arbeiten zu 
können. Wenn hier jetzt einige Leute wegen deinem Stil blockieren, kann 
es Dir egal sein. Im Beruf mit Kollegen allerdings nicht.

von Matthias (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Wen dir deswegen keiner hilft, wird es aber wiederum dein Problem.
>
> Das ist hier ja schon eine Form von Teamarbeit. In Teams muss man sich
> auf einen gemeinsamen Stil einigen, um erfolgreich zusammen arbeiten zu
> können. Wenn hier jetzt einige leute wegen deinem Stil blockieren, kann
> es Dir egal sein. Im Beruf mit Kollegen allerdings nicht.

Stimmt aber da würde keiner diesen Tonfall benutzen...
https://www.mikrocontroller.net/articles/Netiquette

Und ja, da würde ich es wohl auch besser Dokumetieren...

von Stefan F. (Gast)


Lesenswert?

Matthias schrieb:
> aber da (im Beruf) würde keiner diesen Tonfall benutzen...

Jedenfalls wäre ich dann schnell dort weg. Meine Frau hat zwei Firmen 
erlebt, wo sich nur die Frauen permanent angezickt hatten und manchmal 
sogar ihre Arbeiten gegenseitig durcheinander brachten, um die andere zu 
behindern.

Wer weiß, vielleicht sind hier lauter Frauen unterwegs, die sich 
Männernamen geben. Oder echte Weicheier, die sich wie Mimosen benehmen. 
Ich glaube ja, dass diese allgemeine Aggression hier lediglich ein 
Ausdruck von Schwäche ist. Ich will mich selbst dabei nicht einmal 
ausschließen. Ich werde auch laut, wenn ich mich bedrängt fühle.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Matthias schrieb:
1
  while(TxWrite != TxRead);        // Warte bis Platz im Puffer
Dein Code kann wegen dieser Abfrage übrigens immer nur genau 1 Zeichen 
senden. Denn wenn ein Zeichen in den Puffer geschrieben wurde, dann wird 
mit dem Schreiben des nächsten Zeichens so lange gewartet, bis das 
vorige gesendet wurde. Der Puffer von 32 Bytes ist so samt Verwaltung 
unnütz.
1
len = RxLen;              //return actual length of readable bytes
2
RxLen=0;                //Length of readable Bytes = 0
3
uint8_t RxRead_buff=RxRead;        //Get last Read-Addr, wich beginns with 1. Byte, that has not been Read last
Es ist nicht verboten, Kommentare auf Deutsch hinzuschreiben.
Besonders wenn man der Fremdsprache nicht so richtig mächtig ist. Denn 
"actual" heißt nicht direkt "aktuell". "current" träfe es hier besser.

Und wenn die Kommentare dann noch eher für Verwirrung sorgen, als den 
Quelltext zu erläutern, dann ist die Latte völlig gerissen.

Ich musste da ehrlich gesagt den Quelltext lesen um die Kommentare zu 
verstehen... :-/

Matthias schrieb:
> sehe ich es nicht als mein Problem an.
Ja, kann man so sehen.

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.