Forum: Mikrocontroller und Digitale Elektronik bug in Atmega32?


von fragender (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe hier eine kleine FW geschrieben (Anhang) die über die 
UART-Schnittstelle Zeichen einliest und wieder zurücksendet (die FW wird 
später noch erweitert).
Folgendes Problem ist aufgetreten:
Wenn ich in der Main _delay_us(1); wegkommentiere werden keine Zeichen 
gesendet. Mir ist das unerklärlich warum das sein könnte.

Folgende Daten:
Atmega32, 8MHz Takt

Hat da jemand eine Idee??

von Mampf F. (mampf) Benutzerseite


Lesenswert?

fragender schrieb:
> Hat da jemand eine Idee??

Die da sollten auf jedenfall volatile-deklariert sein, sonst kann es 
Probleme mit der Optimierung geben:

uint8_t uart_complete=0;
char data_string[200];

Sie werden im Interrrupt verändert und das kann in der Main-Loop 
Probleme machen.

von Karl M. (Gast)


Lesenswert?

Nee nicht ganz so.

Die Variable sind local und werden nach jedem Durchlauf vernichtet.
1
unsigned char next_byte;
2
uint8_t uart_str_count = 0;

Richtig ist das Schlüsselwort static.
1
uart_str_count++;
Außerhalb der der IF-Abfrage ist auch falsch!
1
if (uart_str_count<=200){
2
// ....
3
} else {
4
// ....
5
}
6
uart_str_count++;

von A. (Gast)


Lesenswert?

Da gibts einiges zu verbessern. Schau mal folgende schnell gebastele 
Variante von mir an:
1
#define F_CPU 8000000UL
2
#define UART_BAUD_RATE 9600L
3
#define UART_BAUD_CALC(UART_BAUD_RATE,F_CPU) ( (F_CPU)/(UART_BAUD_RATE*16L)-1 )
4
5
6
#include <stdio.h>
7
8
#include <avr/io.h>
9
#include <avr/interrupt.h>
10
#include <util/delay.h>
11
#include <avr/eeprom.h>
12
#include <stdbool.h>
13
14
volatile _Bool bReady = false;
15
volatile char aucData[200];
16
volatile uint8_t ucPos = 0;
17
18
int uart_putc(unsigned char c){
19
  while (!(UCSRA & (1<<UDRE)));
20
  
21
  UDR = c;
22
  return 0;
23
}
24
25
void uart_puts (const char *s)
26
{
27
  while (*s) {
28
    uart_putc(*s++);
29
  }
30
}
31
32
int main(void)
33
{
34
  lcd_ini();
35
  
36
  DDRB=0xFF;
37
  
38
  UCSRB|= (1<<RXEN) | (1<<TXEN) | (1<<RXCIE);
39
  UCSRC|= (1<<UCSZ0) | (1<<UCSZ1);
40
  
41
  UBRRH= (uint8_t) (UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)>>8);
42
  UBRRL= (uint8_t) UART_BAUD_CALC(UART_BAUD_RATE,F_CPU);
43
  
44
  sei();
45
  
46
    while(1){
47
    if (bReady){          //Es soll gesendet werden?          
48
      uart_puts(aucData);    //String senden
49
      ucPos = 0;        //Bufferposition auf 0 setzen
50
      bReady = false;      //Empfang wieder freigeben
51
    }
52
    }
53
}
54
55
56
57
ISR (USART_RXC_vect)
58
{  
59
  char ucVal;
60
  
61
  ucVal=UDR;
62
  
63
  if(bReady)            //Sendet gerade?
64
    return;            //Empfangenes Zeichen ignorieren
65
  
66
  if(ucPos == 199)        //Letzte freie Position?
67
    ucVal = '\0';        //Zeichen zu Stringende konvertieren
68
    
69
  aucData[ucPos++] = ucVal;    //Zeichen abspeichern
70
  
71
  if(ucVal == '\0'){        //Stringende erhalten?
72
    bReady = true;        //String senden!
73
  }
74
}

Beitrag #5235173 wurde von einem Moderator gelöscht.
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.