C-Programm für ATmega8 läuft ohne PC-Anschluss nicht

OP #2780302
Lesenswert?

Hallo,

ich bin neu hier im Forum und bringe auch nicht viel Erfahrung mit.
Ich habe mir ein Eval-Board für den ATmega8 gekauft mit samt LC-Display.

Die Hintergrundinfos:
In meinem ersten Programm habe ich mich an einem Uhrenwecker probiert. 
Auf dem LCD läuft in der ersten Zeile die Uhr und in der zweiten Zeile 
wird die Weckzeit gezeigt, die man mit 4 Tastern (Stunden auf/ab; 
Minuten auf/ab) einstellen kann.
Das Board wird über USB am PC angeschlossen. Zusätzliche Stromversorgung 
ist über Stecker möglich (bei mir an einem 9V-Block).
Betriebssystem: Windows XP
Software: myAVR Workpad Plus

Das Problem:
Wenn ich das Board über USB mit Strom versorge, läuft das Programm 
einwandfrei.
Sobald ich aber auf externe Stromversorgung umschalte und das Board vom 
PC entferne, wird auf die Startbedingungen zurückgesetzt. In einem Video 
auf Youtube http://www.youtube.com/watch?v=PLVrgD_470A&feature=plcp 
sieht man das gut.

Hier mal mein Quellcode bis jetzt (das mit dem Anhängen hat bei mir 
warum auch immer nicht funktioniert; hoff der QC stört nicht):
1
volatile int tc;
2
char hr=14, min=3, sec=0;
3
char str[2];
4

5
ISR(TIMER1_OVF_vect)
6
{
7
  TCNT1 = 51136; tc++;
8
}
9

10
int main (void)
11
{
12
  TIMSK |= _BV(TOIE1);   //Overflow-Interrupt für Timer 1 aktivieren
13
  TCCR1B |=(1<<CS12);   //Vorteiler 256
14
  TCNT1 = 0x0000;     //ffff als Startwert
15
  sei();
16
  
17
  lcdInit();
18
  void lcdClear();
19
  lcdGoto(1,4);
20
  lcdWrite("Uhr: 14:03:00");
21
        
22
  while(1)
23
  {  
24
    sec=tc;
25
    
26
    if(sec==60)
27
    
28
    {tc=0; sec=0; min++;
29
    
30
    if(min==60) {min=0; hr++; if(hr==24) hr=0;}
31
    
32
    sprintf(str,"%02d",min); lcdGoto(1, 12); lcdWrite(str);
33
    sprintf(str,"%02d",hr); lcdGoto(1, 9); lcdWrite(str);
34
    
35
    }
36
    
37
    sprintf(str,"%02d",sec); lcdGoto(1, 15); lcdWrite(str);
38
    
39
    while(sec==tc);
40

41

42
      DDRB = 0xff;  //PORTB als Ausgang für Speaker und LED
43
      DDRC = 0x00;  //PORTC als Eingang für Taster zum Stellen der Weckzeit
44
      PORTC = 0xff;  //PullUp-Widerstände an PORTC ein
45
    
46
      volatile char h, m;
47
      
48
      lcdGoto(2,1);
49
      lcdWrite("Wecker:   :  ");
50
      
51
      
52
      if (!(PINC&0x01))  //Funktion: Stunden hochstellen
53
      {
54
        if (h<23) {h++;}
55
        else {h=0;};
56
      }
57
      
58
      if (!(PINC&0x04))  //Funktion: Stunden runterstellen
59
      {
60
        if (h>=1) {h--;}
61
        else {h=23;};
62
      }
63
      
64
      if (!(PINC&0x02))  //Funktion: Minuten hochstellen
65
      {
66
        if (m<59) {m++;}
67
        else {m=0;};
68
      }
69
      
70
      if (!(PINC&0x08))  //Funktion: Minuten runterstellen
71
      {
72
        if (m>=1) {m--;}
73
        else {m=59;};
74
      }
75
    
76
      if ((h==hr)&&(m==min))  //Wenn Weckzeit = Uhrzeit, dann Speaker und rote LED an
77
      {
78
        PORTB=0xff;
79
      }
80
      
81
      else
82
      {
83
        PORTB=0x00;
84
      }
85
      
86
      
87
      sprintf(str,"%02d",h); lcdGoto(2,9); lcdWrite(str);   //Weckzeit (Stunden) anzeigen
88
      sprintf(str,"%02d",m); lcdGoto(2,12); lcdWrite(str);  //Weckzeit (Minuten) anzeigen
89
    }
90
    return 0;
91
    
92
}
Persönliche Seite #2780338
Lesenswert?

Gast #2780437
Lesenswert?

>> Vermutlich geht die Spannung der Batterie in die Knie und der Brown-Out
>> Reset schlägt zu.

>Gibt es da eine Möglichkeit, das zu umgehen?

Netzteil verwenden.

Wenn die Versorgungsspannung zu gering ist, wird der Mikrocontroller 
unberechenbar und macht völlig unvorhersehbare Aktionen. Um das zu 
vermeiden, gibts die Brown-Out Schaltung im µC, die bei zu geringer 
Versorgungsspannung einen Reset auslöst.

Da du eine 9 Volt Batterie verwendest, gehe ich davon aus, dass da schon 
ein Spannungsregler auf dem Board drauf ist. Ersetze die Batterie durch 
ein normales Steckernetzteil mit 9 Volt Gleichspannung.
OP #2780632
Lesenswert?

Andreas B. schrieb:
> Kannst du mal prüfen was für eine Spannung am Resetpin anliegt?

Die Spannung bezogen zu Gnd beträgt 2,4V.

Magnus Müller schrieb:
> Miss mal bei ausgeschaltetem Board den Widerstand zwischen Pin 7 und
> Pin 19 des Controllers.

Das sind bei mir 2,55 Megaohm.

Andreas schrieb:
> Da du eine 9 Volt Batterie verwendest, gehe ich davon aus, dass da schon
> ein Spannungsregler auf dem Board drauf ist. Ersetze die Batterie durch
> ein normales Steckernetzteil mit 9 Volt Gleichspannung.

Jawoll, nen 7806er ist onboard.

Habe es mit 9V/0,5A ausprobiert, da gibts auch keinen Unterschied.
Und als wieder die direkten 5V aus dem USB-Port kamen, hats wieder 
einwandfrei funktioniert...

Lowtzow .... schrieb:
> schalte von portb und portc wirklich nur die pins, welche du für die
> Taster, LED und den speaker brauchst. bzw kommentier die ports testweise
> mal aus.

Meinst du damit:
1
  DDRB = 0x01;  
2
  DDRC = 0x0f;
?
#2780638
Lesenswert?

Nachtrag zum 9V-Block.
Über den Brückengleichrichter am Eingang verlierst du etwa 1,2V, der 
Spannungsregler hat ein DropOut von etwa 2V, das macht bei einem 7806 
dann schon 9,2V aus.
Da darf der 9V Block nicht sehr in die Knie gehen damit die 
Spannungsregelung nicht mehr richtig funktioniert.
Solange du keine großartigen Verbraucher anschließt und dein Finger 
keine Blase zieht wenn du den Spannungsregler berührst, kannst du die 
Eingangsspannung problemlos auf 12 - 15V erhöhen.
OP #2780641
Lesenswert?

Hubert G. schrieb:
> Hast du schon mal den Dip-Switch 1 auf OFF geschaltet?

Nein habe ich nicht, was passiert, wenn ich das mache? Wenn das 
ungefährlich ist, dann probier ichs gleich aus.

Hubert G. schrieb:
> Solange du keine großartigen Verbraucher anschließt und dein Finger
> keine Blase zieht wenn du den Spannungsregler berührst, kannst du die
> Eingangsspannung problemlos auf 12 - 15V erhöhen.

Gut, der 06er wird n bissle warm, dann werd ich mal mein Netzgerät 
fertigmachen.
OP #2780655
Lesenswert?

Ich habe jetzt das Board angesclossen über USB und den 9V-Block auch 
angeschlossen. Dip 1=on.

Nun, das Programm läuft.

Jetzt Dip 1=off.
Programm läuft immernoch.

Ohne Veränderungen wird USB ausgesteckt.
Es kommt zum Reset.

Gleiche Versuche mit Netzteil:
Dip 1=on.

Problem: der Wecker zeigt mir -19-39 an.
Also stell ich im Programm um:
von:
1
DDRB = 0xff;
2
DDRC = 0x00;  
3
PORTC = 0xff;
4
    
5
volatile char h, m;
6
      
7
      
8
lcdGoto(2,1);
9
lcdWrite("Wecker: 14:02");

auf
1
DDRB = 0xff;
2
DDRC = 0x00;  
3
PORTC = 0xff;
4
    
5
volatile char h=14, m=2;
6
      
7
      
8
lcdGoto(2,1);
9
lcdWrite("Wecker:   :  ");

und wieder zurück auf
1
DDRB = 0xff;
2
DDRC = 0x00;  
3
PORTC = 0xff;
4
    
5
volatile char h, m;
6
      
7
      
8
lcdGoto(2,1);
9
lcdWrite("Wecker: 14:02");

Dann läuft das Programm wieder.

Wiederholt mit DIp 1=off: Programm läuft

Nun USB ausstecken: und wieder Reset
Gast #2802308
Lesenswert?

Hallo,

das "Problem" wurde im myAVR-Forum schon öfters mal besprochen und die 
von myAVR selbst weisen darauf hin, dass der Programmer abgezogen werden 
muss wenn er nicht an USB angeschlossen ist da dieser MK2-Programmer 
nicht von der Schaltung aus versorgt wird und damit undefinierte 
Zustände hat... eine Versorgung des Programmers aus der Schaltung ist 
nach Aussage von nur beim MK3 vorgesehen

Gruß J.
(Firma: Manfred) #2802413
Lesenswert?

Hallo,

ich hatte auch den mk2-Programmer angeschlossen und ähnliche Probleme 
mit sporadischen Resets, hab dann in myAVR-Forum zum Programmer 
diskutiert und folgendes Ergebnis:

1) Platine ohne Programmer und externer Versorgung=problemlos
2) Platine mit Programmer und Programmer am laufenden PC angehängt und 
ohne externer Versorgung=problemlos
3) Platine mit Programmer und Programmer am laufenden PC angehängt und 
mit externer Versorgung=problemlos
4) 2) Platine mit Programmer und Programmer NICHT am laufenden PC 
angehängt und mit externer Versorgung=VERBOTEN, sporadische Resets.

Wenn also keine USB-Spannung vorhanden ist, dann darf der Programmer 
nicht gesteckt sein!

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