Forum: Mikrocontroller und Digitale Elektronik ATmega32 mit GLCD resetet ständig


von Walter T. (nicolas)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
ich habe gerade (d.h. den ganzen Sonntag) ein merkwürdiges Verhalten, 
für das sich alle Erklärungsversuche als falsch herausgestellt haben.

Es handelt sich dabei um einen ATmega32 mit einem Grafik-Display mit 
zwei KS0108 und einem normalen HD47800-kompatiblen Text-LCD (letzteres 
soll durch ersteres ersetzt werden).

Dummerweise resetet sich der Controller ständig, oder besser: Häufig, in 
sehr unregelmäßigen Abständen, wenn ich auf dem Grafik-Display einen 
Text darstellen will.

Das merkwürdige ist, daß an anderer Stelle durchaus Texte problemlos 
darzustellen gehen. Wenn ich eine Zeile einkommentiere, resetet sich der 
Controller, nehme ich sie heraus, läuft alles problemlos durch.

Speicherprobleme aufgrund der Einbindung von snprintf/stdio schließe ich 
mal aus, da an anderer Stelle weitaus längere Textstrings erzeugt 
werden.
Auch lassen sich konstante längere Strings problemlos ständig 
darstellen.
Mir sind die Ideen ausgegangen. Habt ihr neue?

So sieht's im Quelltext aus: (Die merkwürdige Stelle ist markiert). 
Leider geht es nicht kürzer, weil ich die Ursache nicht eingrenzen kann.
1
/* Pulsgenerator 
2
 * 
3
 * HD44780-kompatibles LCDs im 4-Bit-Modus an PB0, PB3, PB4, PB5, PD4, PD5, PD6, PD7
4
 *
5
 * Seitenzahlen gemaess Datenblatt ATmega168 Rev. 2545T-AVR-05/11
6
 *
7
 * 20.11.2011
8
 */
9
#ifndef F_CPU
10
  #define F_CPU 16000000UL
11
#endif
12
13
#include <avr/io.h> 
14
#include <util/delay.h>
15
#include <stdio.h>
16
#include <avr/interrupt.h>
17
#include "lcd4.h"
18
#include "glcd_ks0108.h"
19
#include "glcd_textfun.h"
20
21
22
// Settings ADC
23
// Referenzspannung: AVcc mit externem, Kondensator an ARef,
24
// Ergebnis linksbündig ausrichten:
25
#define ADCMUXCONFIG (1<<REFS0)|(0<<REFS1)|(1 << ADLAR)
26
27
// Funktionsdeklarationen
28
uint8_t getadc(uint8_t muxChannel);
29
30
// Variablendeklaration
31
char strOut[41];        // String fuer Textoutput
32
int clock = 0;          // Hauptschleifendurchlaufzaehler (Debugging)
33
uint8_t tOnSoll = 0;    // Pulsbreite   (default)
34
uint8_t tOffSoll = 255; // Pausenbreite (default)
35
36
// Konstanten
37
#define T_ON_MIN 8      // 4 µs, untere Grenze Pulsbreite
38
#define T_OFF_MIN 8     // 4 µs, untere Grenze Pausenbreite
39
40
41
int main(void)
42
{
43
    // ADC initialisieren
44
    while (bit_is_set(ADCSRA, ADSC));
45
    ADMUX = ADCMUXCONFIG;
46
47
    // Datenblatt S.256
48
    // ADC einschalten
49
    // 16 MHz / 128 = 125 kHz ADC-Clock
50
    ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
51
52
    // Free running mode.
53
    //ADCSRB = (0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
54
55
    // Timer1 einstellen (S.132)
56
    // PWM-Modus 14 
57
    // Timer1 an OC1A (PD7)
58
    // OCR1A : Schaltpunkt 1
59
    // ICR1  : Schaltpunkt 2
60
    TCCR1A  = (1<<COM1A1)|(1<<COM1A0)|(0<<COM1B1)|(0<<COM1B0)|(1<<WGM11)|(0<<WGM10);
61
    TCCR1B = (0<<ICNC1)|(0<<ICES1)|(1<<WGM13)|(1<<WGM12)|(0<<CS12)|(1<<CS11)|(0<<CS10);
62
    OCR1A = 128;
63
    ICR1 = 150;
64
    DDRD |= (1 << PD5);  // PWM-Pin vorbereiten
65
    sei(); 
66
    // Ende ADC
67
68
    // Entsprechende Pins auf Ausgang und LCD initialisieren, Text-LCD
69
    lcd_init();                      
70
    lcd_clear();  
71
    lcd_putstr("Init OK");
72
73
    // Grafik-LCD vorbereiten
74
    glcd_init(); 
75
    glcd_pos(2,0);
76
    glcd_putstr("Hallo");
77
    glcd_pos(3,0);
78
79
    int sensor1 = 0;
80
81
    while(1)
82
       {
83
      // Hauptschleife ist sehr langsam, aber zeitunkritisch,
84
      // da das Timing ueber die PWM-Timer erzeugt wird.
85
86
      // Vorgaben aus Potis auslesen und begrenzen
87
      uint8_t ergebnis1 = getadc(3);
88
      uint8_t ergebnis2 = getadc(4);
89
      uint8_t sense1 = getadc(5);
90
91
      sensor1 = (7*sensor1 + sense1)/8;
92
93
      tOnSoll = ergebnis1/2;
94
      if (tOnSoll < T_ON_MIN)
95
          tOnSoll = T_ON_MIN;
96
97
      tOffSoll = ergebnis2/2;
98
      if (tOffSoll < T_OFF_MIN)
99
         tOffSoll = T_OFF_MIN;
100
101
      // In Timer ablegen
102
      OCR1A = tOnSoll;
103
      ICR1 = tOnSoll+tOffSoll;
104
105
      // Display updaten
106
      lcd_pos(0,0);
107
      snprintf(strOut,40,"CK=%4d Sen=%3d",clock++,sensor1);
108
      lcd_putstr(strOut);
109
      lcd_pos(0,1);  // In zweite Zeile erstes Zeichen 
110
111
      snprintf(strOut,40,"ON=%2d%cs OFF=%2d%cs ",tOnSoll/2,0xE4,tOffSoll/2,0xE4);
112
      lcd_putstr(strOut);
113
114
      /* **********************************************
115
         * Stelle aber vermutl. nicht Ursache des Fehlers *
116
         ********************************************** \
117
      glcd_pos(1,0);
118
      //glcd_putstr(strOut); // <- die boese Zeile
119
120
      glcd_pos(3,0);
121
      snprintf(strOut,10,"%4d" ,clock);
122
      glcd_putstr(strOut);
123
124
      }
125
  return 1;
126
}
127
128
129
/* ADC-Teile */
130
// ADC-Kanal auslesen (nur 8 Bit)
131
// Routine sehr langsam, da warten
132
// channel: 0 - 6
133
// Konstante ADCMUXCONFIG
134
// Seite 225
135
uint8_t getadc(uint8_t muxChannel)
136
{
137
    // Erst ADCL, dann ADCH auslesen. Danach ist das Register geloescht.
138
    // hier wird nur ADCH benoetigt und ADCL ignoriert:
139
    uint8_t ergebnis;
140
141
    ADMUX = ADCMUXCONFIG | muxChannel;
142
    ADCSRA  |= (1 << ADSC);   // Wandlung starten
143
  while (bit_is_set(ADCSRA, ADSC)); // warten
144
    ergebnis = ADCH; // Wert auslesen und wegwerfen
145
    ergebnis = ADCH; // obere 8 Bit auslesen
146
147
    return ergebnis;
148
}

Viele Grüße
Nicolas

von Krapao (Gast)


Lesenswert?

Bist du sicher, dass du in strOut kein Zeichen hast bei dem du außerhalb 
von FONT[] zu greifst?

Du hast da eine rel. unübersichtliche Zeichen=>Bitmap Umrechnung drin, 
die ist mir suspekt.

> void glcd_putstr(char *zeichenkette)
>   void glcd_putchar(char c)
>     glcd_putdat(pgm_read_byte(&FONT[5*c-i-(31*5)]) );

Mir gefällt nicht, dass sowohl c als auch i an dieser Stelle den 
Datentyp char haben und dass mit Zahlen außerhalb des char 
Datenbereichs verglichen und zugewiesen wird

Bsp.: c bekommt der Funktion im switch den Wert "128" zugewiesen. Aber 
tatsächlich steht in c der Wert -128 da char ein Vorzeichenbehafteter 
Datentyp ist! Setze dann mal die -128 in die Formel 5*c-i-(31*5) ein...

von Daniel H. (Firma: keine) (commander)


Lesenswert?

Blöde Frage, aber RESET korrekt beschaltet, Abblockkondensantoren usw. 
vorhanden?

von Walter T. (nicolas)


Lesenswert?

Hallo ihr beiden,
erst einmal danke für's Anschauen, der Quelltext ist schon grob 
unübersichtlich.

Die Vorzeichen in "putchar" gucke ich mir noch einmal in Ruhe heute 
abend an. Es kann sein, daß da ein Schnellschuß drin ist. Vor allem eine 
Abfrage für c < 0 habe ich einfach nicht bedacht. Daran wird es aber 
auch wohl eher nicht liegen, da der Fehler ja sehr unregelmäßig auftritt 
(nicht bei einem bestimmten Zählerstand).

Die Versorgungsspannung ist stabil und auch ausreichend abgeblockt an 
beiden Displays und am ATmega, allerdings nicht wahnsinnig niederohmig. 
Aber auch in der Richtung schaue ich heute abend mal nach, vielleicht 
wird der Reset ja durch einen Dip in der Versorgungsspannung bewirkt.

Viele Grüße
Nicolas

von Krapao (Gast)


Lesenswert?

Du kannst auch mal versuchen, im MCUCSR Register die Resetursache 
auszuwerten, um zu sehen, ob es z.B. ein Brownout war.

von Walter T. (nicolas)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
MCUCSR wird als "0" ausgelesen- also ist der unfreiwillige Reset wohl 
gar keiner (BODEN-Fuse ist aktiv, ein Brown-Out würde also auch als 
solcher erkannt).
Die Versorgungsspannung ist stabil und keinerlei Einbruch feststellbar. 
Ich habe mir allerdings auch die Reset-Leitung noch einmal vorgenommen 
und dort auch in unregelmäßigen Anständen Oszillationen (siehe Bild im 
Anhang) feststellen können, die auch in unregelmäßigen Abständen (5 - 15 
s) auftreten. Allerdings ist keine Korrelation zwischen den 
Oszillationen und dem Nicht-Reset festzustellen. Ein Abblocken mit 100nF 
am Reset-Pin ändert auch nichts am Verhalten.

Nach dem Entfernen der "bösen" Zeile bleiben die Oszillationen und der 
Nicht-Reset verschwindet.

Es bleibt mysteriös.

Viele Grüße
Nicolas

von Michael (Gast)


Lesenswert?

Hi,

ich hatte das gleiche Problem allerdings mit Bascom.
Die Lösung war seltsam aber ok ...

Ich darf einfach nicht mit 1,0 in die erste Zeile schreiben sondern mit
1,1 also ein Pixel von links weg. Dann funzt alles prima!

Vielleicht bringt das ja auch bei dir was.

von Walter T. (nicolas)


Lesenswert?

Hallo Michael,
danke für den Tip, aber das war's leider auch nicht. Dafür habe ich den 
Übeltäter enger eingrenzen können: In den extrem seltenen Fällen, wo 
sich der ATmega32 aufhängt und nicht den Nicht-Reset schafft, bleibt er 
an der folgenden Stelle stehen (in glcd_ks0108.c):
1
void glcd_wait()
2
{
3
  //_delay_ms(1);
4
5
  // Abfragen des Busy-Flags und warten
6
  // Leider muessen nach dem Loeschen des Busy-Flags
7
  // noch einige Takte weiter gewartet werden.
8
  PORT_GLCDDATA = 0x00;             // Pins zuruecksetzen, sonst Pull-Up
9
  DDR_GLCDDATA  = 0x00;
10
  PORT_GLCDCTRL &= ~(1 << GLCD_RS);
11
  PORT_GLCDCTRL |=  (1 << GLCD_RW);
12
  PORT_GLCDCTRL &= ~(1 << GLCD_RS);
13
  // Fuer Abfrage Busy-Flag muss mindesten ein CS aktiv sein
14
  char cs_stat = PORT_GLCDCTRL; 
15
  PORT_GLCDCTRL |=  (1 << GLCD_CS1);
16
  PORT_GLCDCTRL &= ~(1 << GLCD_CS2);
17
  asm volatile ("nop");
18
  asm volatile ("nop");
19
  PORTD |= 1 << PD6;           // DEBUG OUTPUT
20
                               //
21
  while(PIN_GLCDDATA & 0x80);  // <----- Boese Zeile (Jetzt noch wissen warum)
22
                               //
23
  PORTD &= ~(1 << PD6);        // DEBUG OUTPUT
24
  asm volatile ("nop");
25
  PORT_GLCDCTRL &= ~(1 << GLCD_RW);
26
  DDR_GLCDDATA  = 0xFF;
27
  asm volatile ("nop");
28
  // CS-Status wiederherstellen.
29
  // Kann ruhig langsam sein, ist eh Warteschleife
30
  PORT_GLCDCTRL &= ~(1 << GLCD_CS1); 
31
  PORT_GLCDCTRL &= ~(1 << GLCD_CS2);
32
  PORT_GLCDCTRL |= (cs_stat & ((1<<GLCD_CS1)|(1<<GLCD_CS2))); // 4 Takte
33
  asm volatile ("nop");
34
  asm volatile ("nop");
35
  asm volatile ("nop");
36
  asm volatile ("nop");
37
  asm volatile ("nop");
38
  asm volatile ("nop");
39
  asm volatile ("nop"); // keins zuviel!
40
  }
Das erstaunliche ist, daß der High-Pegel nicht vom LCD ausgeht, sondern 
vom ATmega. Und zwar ist der Ausgang sehr niederohmig auf High, obwohl 
das Datenrichtungsregistern etwas anderes behauptet.

Ein Blick ins Assembler-Listing bring mich aber auch nicht weiter:
1
000006c6 <glcd_wait>:
2
  //_delay_ms(1);
3
4
  // Abfragen des Busy-Flags und warten
5
  // Leider muessen nach dem Loeschen des Busy-Flags
6
  // noch einige Takte weiter gewartet werden.
7
  PORT_GLCDDATA = 0x00;             // Pins zuruecksetzen, sonst Pull-Up
8
     6c6:  15 ba         out  0x15, r1  ; 21
9
  DDR_GLCDDATA  = 0x00;
10
     6c8:  14 ba         out  0x14, r1  ; 20
11
  PORT_GLCDCTRL &= ~(1 << GLCD_RS);
12
     6ca:  90 98         cbi  0x12, 0  ; 18
13
  PORT_GLCDCTRL |=  (1 << GLCD_RW);
14
     6cc:  91 9a         sbi  0x12, 1  ; 18
15
  PORT_GLCDCTRL &= ~(1 << GLCD_RS);
16
     6ce:  90 98         cbi  0x12, 0  ; 18
17
  // Fuer Abfrage Busy-Flag muss mindesten ein CS aktiv sein
18
  char cs_stat = PORT_GLCDCTRL; 
19
     6d0:  92 b3         in  r25, 0x12  ; 18
20
  PORT_GLCDCTRL |=  (1 << GLCD_CS1);
21
     6d2:  93 9a         sbi  0x12, 3  ; 18
22
  PORT_GLCDCTRL &= ~(1 << GLCD_CS2);
23
     6d4:  94 98         cbi  0x12, 4  ; 18
24
  asm volatile ("nop");
25
     6d6:  00 00         nop
26
  asm volatile ("nop");
27
     6d8:  00 00         nop
28
  PORTD |= 1 << PD6;
29
     6da:  96 9a         sbi  0x12, 6  ; 18
30
  while(PIN_GLCDDATA & 0x80);
31
     6dc:  9f 99         sbic  0x13, 7  ; 19
32
     6de:  fe cf         rjmp  .-4        ; 0x6dc <glcd_wait+0x16>
33
PORTD &= ~(1 << PD6);
34
     6e0:  96 98         cbi  0x12, 6  ; 18
35
  asm volatile ("nop");
36
     6e2:  00 00         nop
37
  PORT_GLCDCTRL &= ~(1 << GLCD_RW);
38
     6e4:  91 98         cbi  0x12, 1  ; 18
39
  DDR_GLCDDATA  = 0xFF;
40
     6e6:  8f ef         ldi  r24, 0xFF  ; 255
41
     6e8:  84 bb         out  0x14, r24  ; 20
42
  asm volatile ("nop");
43
     6ea:  00 00         nop
44
  // CS-Status wiederherstellen.
45
  // Kann ruhig langsam sein, ist eh Warteschleife
46
  PORT_GLCDCTRL &= ~(1 << GLCD_CS1); 
47
     6ec:  93 98         cbi  0x12, 3  ; 18
48
  PORT_GLCDCTRL &= ~(1 << GLCD_CS2);
49
     6ee:  94 98         cbi  0x12, 4  ; 18
50
  PORT_GLCDCTRL |= (cs_stat & ((1<<GLCD_CS1)|(1<<GLCD_CS2))); // 4 Takte
51
     6f0:  82 b3         in  r24, 0x12  ; 18
52
     6f2:  98 71         andi  r25, 0x18  ; 24
53
     6f4:  98 2b         or  r25, r24
54
     6f6:  92 bb         out  0x12, r25  ; 18
55
  ...
56
  asm volatile ("nop");
57
  asm volatile ("nop");
58
  asm volatile ("nop");
59
  asm volatile ("nop");
60
  asm volatile ("nop");
61
  asm volatile ("nop"); // keins zuviel!
62
     704:  00 00         nop
63
64
  }
65
     706:  08 95         ret
Eigentlich alles so, wie es sein sollte: DDRC ist komplett auf 0x00, und 
PORTC auch. So langsam habe ich das Gefühl bekloppt zu sein. Oder daß in 
PORTC irgendetwas nicht stimmt. (JTAGEN ist aus, Fuses 0xD9BF).

Viele Grüße
Nicolas

von Oliver (Gast)


Lesenswert?

Hast du den Code selbergeschrieben?

Soweit ich mich erinnere, sitzt das busyflag im statusregister, und das 
musst du per "status_read" auslesen, um dessen aktuellen Wert zu 
bekommen. "Einfach so" ändert sich der Pin am Dataport des LCD's nicht.

Generell ist es aber schneller und einfacher, das busyflag gar nicht 
erst auszulesen, sondern einfach 0.5ms (oder so, ausprobieren) nach 
jedem Befehl zu warten.

Oliver

von Walter T. (nicolas)


Lesenswert?

Hallo Oliver,
ja, der Code ist selbstgeschrieben. Wenn ich einen Delay einbaue statt 
der Abfrage des Statusbits läuft alles, nur sind meine Displays von 
einem namhaften Resteverwurster aus Pförring und brauchen mindesten 3ms 
delay.

Der Status wird auch korrekt abgefragt, wie im Datenblatt angegeben. 
Momentan habe ich das unterklärliche Phänomen, daß der PD7 ein Ausgang 
ist, obwohl er ein Eingang sein sollte. (Zumindest ist der Pegel auch 
gegen einen Pull-Down-Widerstand High), obwohl er ein Eingang sein 
sollte. Ich bin jetzt von PORTC auf PORTB umgezogen, und das Phänomen 
läßt sich immer noch reproduzieren.

Viele Grüße
Nicolas

von holger (Gast)


Lesenswert?

>Wenn ich einen Delay einbaue statt
>der Abfrage des Statusbits läuft alles, nur sind meine Displays von
>einem namhaften Resteverwurster aus Pförring und brauchen mindesten 3ms
>delay.

Du meinst doch wahrscheinlich ein 3us Delay;)
3ms wäre schon extrem lang.

Einen funktionierenden Busy Check habe ich bei KS0108 bisher
noch nicht hinbekommen. Auch mehrere fremde Sourcecodes die vorgeben
einen Busy Check zu machen haben bei mir nie funktioniert.
Lag wohl daran das die Sourcen meist selber nur mit geringem Takt 
liefen.

Wie lang das Delay ist hängt vom Takt des Displays ab.
Hier mal für meine Displays (in us):

#define KS108_E_DELAY    2   // Pollin Display TG12864B 596kHz FCLK
//#define KS108_E_DELAY    4  // Displaytech 64240A 395kHz FCLK.

Wenn du ein vernünftiges Display suchst das auch einen
Busy Check erlaubt dann nimm eines mit T6963C. Der KS0108 ist
einfach nur billiger Kram. Oder gleich ein DOGM mit SPI.
Die Dinger sind echt schnell.

von Walter T. (nicolas)


Lesenswert?

Hallo Holger,
ein SPI-Display (z.B. Nokia-Display) wäre ein Traum, aber die alten 
KS0108 müssen auch weg (und sind für meinen Zweck genau richtig wegen 
der Größe und weil langsam kaum eine Rolle spielt).

Aber es ist zum heulen: Ich kriege den Fehler immer wieder reproduziert:
Wenn's abstürzt ist das Datenrichtungsregister vom LCD-Port falschherum. 
Hier der Code:
1
// RS : 0=Instruction 1=data
2
// LR : 0=left, 1=Right
3
void glcd_putsth(char value,uint8_t RS,uint8_t LR) {
4
  PORT_GLCDCTRL &= ~(1 << GLCD_ECLK); // Enable Low
5
  asm volatile ("nop");
6
    :
7
    :
8
  asm volatile ("nop"); 
9
10
  PORT_GLCDCTRL &= ~(1 << GLCD_RW);   // Write
11
  if(RS)                              // Instruction/Data
12
    PORT_GLCDCTRL |=  (1 << GLCD_RS);
13
  else
14
    PORT_GLCDCTRL &= ~(1 << GLCD_RS);
15
  if(LR) {                            // Left/Right
16
    PORT_GLCDCTRL |=  (1 << GLCD_CS1);
17
  PORT_GLCDCTRL &= ~(1 << GLCD_CS2);
18
  }
19
  else {
20
    PORT_GLCDCTRL &= ~(1 << GLCD_CS1);
21
    PORT_GLCDCTRL |=  (1 << GLCD_CS2);
22
  }
23
  asm volatile ("nop");
24
      :
25
      :
26
  asm volatile ("nop"); 
27
  PORT_GLCDCTRL |=  (1 << GLCD_ECLK);
28
  asm volatile ("nop");
29
      :
30
      :
31
  asm volatile ("nop");  
32
  DDR_GLCDDATA = 0xFF;               
33
  PORT_GLCDDATA = value;               
34
  asm volatile ("nop");
35
     :
36
     :
37
  asm volatile ("nop");  
38
  PORT_GLCDCTRL &= ~(1 << GLCD_ECLK); // mehr als450ns warten
39
  asm volatile ("nop");
40
     :
41
     :
42
  asm volatile ("nop");
43
  PORT_GLCDCTRL |=  (1 << GLCD_RW);
44
  PORT_GLCDCTRL &= ~(1 << GLCD_RS);
45
  DDR_GLCDDATA = 0x00;
46
  PORT_GLCDDATA = 0x00;        // Pullups aus 
47
  asm volatile ("nop");
48
     :
49
     :
50
  PORTA = DDR_GLCDDATA;
51
  PORTD |= 1 << PD6;           // DEBUG OUTPUT
52
  while(bit_is_set(PIN_GLCDDATA,7));  // <----- Boese Zeile (Jetzt noch wissen warum)
53
  PORTD &= ~(1 << PD6);        // DEBUG OUTPUT
54
  asm volatile ("nop");
55
     :
56
     :
57
  asm volatile ("nop"); // keins zuviel!
58
  }
Immer, wenn der ATmega abschmiert stehen alle Pins von PORTA auf High, 
d.h. das Datenrichtungsregister von DDRB hat den falschen Wert 
hinterlegt. Und ich weiß nicht warum. Es gibt keinen Interrupt mehr und 
nichts, was dazwischen kommen könnte.

Viele Grüße
Nicolas

von spess53 (Gast)


Lesenswert?

Hi

>Immer, wenn der ATmega abschmiert stehen alle Pins von PORTA auf High,
>d.h. das Datenrichtungsregister von DDRB hat den falschen Wert
>hinterlegt.

Was nun? PortA oder PortB?

MfG Spess

von Oliver (Gast)


Lesenswert?

Nicolas S. schrieb:
> while(PIN_GLCDDATA & 0x80);  // <----- Boese Zeile (Jetzt noch wissen warum)

Nicolas S. schrieb:
> Der Status wird auch korrekt abgefragt, wie im Datenblatt angegeben.

Nicolas S. schrieb:
> wenn ich einen Delay einbaue statt
> der Abfrage des Statusbits läuft alles,

Eine der drei Aussagen glaube ich dir nicht.

Um das noch zu erwähnen: Der Klassiker bei unerwarteten resets auf 
Softwareseite ist eine fehlende ISR zu einem freigegeben Interrupt. Da 
du deinen kompletten Code ja nicht zeigst, musst du das selber 
überprüfen.

Oliver

von Walter T. (nicolas)


Lesenswert?

Nicolas S. schrieb:
>
1
 
2
 PORTA = DDR_GLCDDATA;

Beide (wegen Debug-Output)

von Walter T. (nicolas)


Lesenswert?

Hallo nochmal,

ich habe die Lösung (?) gefunden. Um genau zu sein: Ich habe die MCU 
gegen einen ATmega16 getauscht und jetzt funktioniert alles wie 
erwartet. Also hatte wahrscheinlich der alte ATmega32 einen wech - naja, 
hat ja auch schon einiges mitgemacht.

Oliver schrieb:
> Da
> du deinen kompletten Code ja nicht zeigst, musst du das selber
> überprüfen.

Soviel hatte sich im Vergleich zum ersten Posting auch nicht geändert, 
daß ich es für nötig gehalten hätte, es noch einmal zu posten. Um genau 
zu sein nur die Zeilen, die ich auch gepostet habe.

Vielen Dank für die Tips und einen schönen Abend wünscht euch
Nicolas

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.