Forum: Mikrocontroller und Digitale Elektronik C-Programm für ATmega8 läuft ohne PC-Anschluss nicht


von Steffen K. (steffenkeller)


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
}

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

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

Welches Board ist das? Schaltplan?

von Magnus M. (magnetus) Benutzerseite


Lesenswert?


von Steffen K. (steffenkeller)


Lesenswert?

Ja korrekt, MK2 Plus. Ich habe es als Bausatz gekauft und selbst 
gelötet.

Magnus Müller schrieb:
> 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?

von Lowtzow .. (lowtzow)


Lesenswert?

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.

von Andreas (Gast)


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.

von Andreas B. (andreasb)


Lesenswert?

Ggf. gibt es einen Reset durch den Programmer?

Kannst du mal prüfen was für eine Spannung am Resetpin anliegt?

Das Display scheint noch zu laufen, und meine sind sehr empfindlich 
gegenüber zu geringer Spannung...



mfg Andreas

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Steffen Keller schrieb:
> Ja korrekt, MK2 Plus. Ich habe es als Bausatz gekauft und selbst
> gelötet.

Miss mal bei ausgeschaltetem Board den Widerstand zwischen Pin 7 und 
Pin 19 des Controllers. Ich vermute hier einen Kurzschluss welcher durch 
eine Lötbrücke am Bussteckverbinder hervorgerufen wird.

von Hubert G. (hubertg)


Lesenswert?

Hast du schon mal den Dip-Switch 1 auf OFF geschaltet?
Da siehst du ob deine externe Stromversorgung funktioniert.

von Steffen K. (steffenkeller)


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;
?

von Hubert G. (hubertg)


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.

von Steffen K. (steffenkeller)


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.

von Hubert G. (hubertg)


Lesenswert?

Mit dem Switch 1 schaltest du die Stromversorgung über USB aus.
Du solltest dann auch mal die Spannung vor und nach dem Spannungsregler 
messen.

von Steffen K. (steffenkeller)


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

von Steffen K. (steffenkeller)


Lesenswert?

Nachtrag:

beim 7806:

U (Gnd-->In) =12,4V
U (Gnd-->Out) =6,1V

von Hubert G. (hubertg)


Lesenswert?

Ich würde da mal sagen das der USB-Teil beim abstecken vom PC  einen 
Reset auslöst.
Mit deinem Programm hat das nichts zu tun.

von Steffen K. (steffenkeller)


Lesenswert?

Ok, dann frag ich mich aber, warum dann ohne USB-Verbindung der Wecker 
nach dem Auslösen zwar wieder ausgeht, aber auch hier ein Reset abläuft.

von Steffen K. (steffenkeller)


Lesenswert?

Ich habe in der Zwischenzeit folgende Beobachtung gemacht:

Wenn die Weckzeit mit der tatsächlichen Uhrzeit übereinstimmt, und die 
LED leuchtet, kann ich den USB-Stecker sowohl vom Board, als auch vom PC 
entfernen, ohne einen Reset zu verursachen

von compressed (Gast)


Lesenswert?

entferne mal den Programmer vom MK2 Board und starte dann von externer 
Versorgung.

von Steffen K. (steffenkeller)


Lesenswert?

Danke für den Tip!! =)

Beobachtung 1:

Wenn ich bei laufendem Programm den ganzen Programmer entferne, kommt es 
zu KEINEM Reset :-D

2. Beobachtung:

Wenn die Weckzeit vorbei ist, kommt es ebenfalls NICHT zum bisherigen 
Reset =)
Die Frage ist nur warum.

Trotzdem vielen Dank.

von Jahat (Gast)


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.

von Peter II (Gast)


Lesenswert?

das das Programm überhaupt läuft ist schon ein wunder
1
char str[2];
2
sprintf(str,"%02d",min);

von Manfred S. (Firma: Manfred) (xfred343)


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!

von Philipp S. (pschaefer)


Lesenswert?

Peter II schrieb:
> das das Programm überhaupt läuft ist schon ein wunder
>
>
1
> char str[2];
2
> sprintf(str,"%02d",min);
3
>

[ironie]
Also ich seh da gar keinen Fehler. C Strings werden doch nicht etwa 
terminiert.
[/ironie]

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.