Forum: Mikrocontroller und Digitale Elektronik MEGA32 nach C-Source Änderung tot :-(


von Michael F. (frettchen1982)


Lesenswert?

Hallo Leute,

ich bekomme die Krise.

Mal von Anfang an. Eigentlich bin ich Buchhalter und hatte aber schon 
immer Spaß am basteln.

Vor nem Jahr habe ich dann für eine örtliche Veranstaltung ein 30m 
Langes LED Lauflich gesucht und zum Schluss selbst gebaut.

Ist mit einem ATMega32 auf eine Lochraster aufgebaut. Dabei ein 10-pol 
ISP und normal Versorgung mit einem 7805.

Mein Programmer habe ich nach dieser Anleitung gebaut: 
http://www.rn-wissen.de/index.php/AVR-ISP_Programmierkabel

Da ich mal QBasic gelernt habe, hin und wieder VB.Net benutze und auch 
beruflich VBA benötige für meine Excel files, habe ich mal mit Bascom 
angefangen.

Damit habe ich dann das Lauflicht gemacht und seit dem lag das ding in 
der Ecke.

Nun mangelt es in der Wohnung nach einer kleiner Steuerung für die 
Heizung, was mich als Bastler natürlich auf den Plan ruft.

Aber, wie ich unweigerlich festgestellt habe, ist hier C die bessere 
alternative und so habe ich heute abend mal damit begonnen. Das alte 
Lochrasterboard wieder rausgekramt und PC4 - PC7, VCC und GND auf ein 
Steckbrett gezogen und 4 LED`s ran. Zum Code schreiben benutze ich AVR 
Studio 6. Da mein neuer Laptop hier kein Paralell-Port mehr hat, habe 
ich den alten noch daneben gestellt und da nur PonyProg drauf gemacht 
zum flaschen der hex file.

Hebe dann angefangen erstmal die LED mit delays leuchten zu lassen. 
Erwähnen sollte ich noch, dass der AVR mit dem internen Quarz läuft, 
welches ich damals mit Bascom noch auf 8MHz eingestellt habe.

So nun habe ich immer wieder an meinem C-Code geschrieben und geflasht. 
Das bestimmt 20 mal.

Dann habe ich mit dem Timer angefangen. 8Bit Timer0 eingestellt auf 
Prescale 64 und Preload 131. Sollte dann alle 1ms den Overflow Interupt 
auslösen. Diser hat einen Zähler immer +1 gestellt und bei if Zähler == 
1000 eine LED getoggelt.

Leider kam kein Sekundentakt raus. Fehler gefunden: Nach Timer overflow 
habe ich vergessen den Preloader wieder auf 131 zu stellen. Habe das 
dann im Code angepasst und ihn direkt erweitert. Ziel sollte sein:

PC5, 6, 7 gehen an. 4 Blinkt im Sekundentakt. 5 6 7 geht nach je einer 
Sekunde nacheinander aus. Dann wird eine Minute gezählt, 5 geht an. Nach 
2 Minuten geht noch 6 an und nach 3 auch 7.

Wollte quasi nach 321 Los eine Stoppuhr einschalten um mal die 
Genauigkeit zu testen.

Beim Pony habe ich in der .ini nun noch das Verifying ausgestellt weil 
es ewig dauert.

Habe dann geflasht. 6 und 7 wurde auf 1 High geschaltet. 4 hat nicht im 
Sekundentakt geblinkt. Ok, dacht ich mir. Da ist was faul. Habe dann 
noch einen Fehler gefunden, weiss aber nicht mehr genau was es war. 
Nichts großes. Irgend ein Fehler beim Zähler der ms. Und jetzt kommt es: 
Ich flashe wieder, 6 und 7 gehen aus (Normal) aber nichts geht mehr an. 
Nanu? Nochmal veruscht zu flashen. Fehlermeldung. Keine Verbindung mehr 
möglich. Lesen? Nichts! Fuses lesen? Nichts.

Bascom an: Kein Chip erkannt!

Alles aus, wieder an: Nichts.

Kann ich mit dem Code hier wirklich den AVR verbraten? Ich kannst nicht 
glauben.

Sorry wen der Stil vielleicht komisch ist, aber es ging ja um die 
Funktionen erstmal.

Weiss jemand rat?

Danke und Grüße
Michael

1
#define F_CPU 8000000
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
#include <avr/interrupt.h>
6
7
8
9
uint16_t CountLedRot = 0;
10
uint16_t CountLedGelb = 0;
11
uint16_t DreiZweiEins = 0;
12
13
14
15
void LedRotAnAus(void);
16
void LedGelbAnAus(void);
17
void DreiZweiEins_func(void);
18
19
void DreiZweiEins_func(void)
20
{
21
  if (DreiZweiEins == 1000) PORTC &= ~ (1<<PC7);
22
  if (DreiZweiEins == 2000) PORTC &= ~ (1<<PC6);
23
  if (DreiZweiEins == 3000)
24
  {
25
  PORTC &= ~ (1<<PC5);
26
  CountLedRot = 0;
27
  }
28
  DreiZweiEins ++;
29
}
30
31
void LedGelbAnAus(void)
32
{
33
  if (CountLedGelb == 1000)
34
  {
35
    PORTC ^= (1<<PC4);
36
    CountLedGelb = 0;
37
  }
38
  else
39
  {
40
  CountLedGelb ++;
41
  }
42
}
43
44
void LedRotAnAus(void)
45
{
46
  if (CountLedRot == 60000) 
47
  {
48
    PORTC |= (1<<PC5);
49
  }
50
  if (CountLedRot == 120000)
51
  {
52
    PORTC |= (1<<PC6);
53
  }
54
  if (CountLedRot == 180000)
55
  {
56
    PORTC |= (1<<PC7);
57
  }
58
  if (CountLedRot == 240000)
59
  {
60
    PORTC &= ~ ((1<<PC5) | (1<<PC6) | (1<<PC7));
61
    CountLedRot = 0;
62
  }
63
  else
64
  {
65
    CountLedRot ++;
66
  }
67
  
68
}
69
70
71
72
int main(void)
73
{
74
  
75
  TCCR0 |= (1<<CS01) | (1<<CS00);  // Bits für Prescale setzen
76
  TCNT0 = 131;          // Counter des Timers voreinstellen (Preloader)
77
  TIMSK |= (1<<TOIE0);      //Timer Overflow IR einschalten
78
  
79
  sei();              //Alle Interrupts erlauben
80
  
81
  DDRC =0xFF;            //Alle Pins an PortC aud Ausgang
82
  
83
84
  PORTC |= ((1<<PC5) | (1<<PC6) | (1<<PC7)); //LED 1,2 und 3 einschalten
85
    
86
  while(1)
87
    {  // Anfang Hauptschleife
88
        
89
       
90
    }  // Ende Hauptschleife
91
}
92
93
94
95
  ISR (TIMER0_OVF_vect)      
96
  {
97
    TCNT0 = 131;
98
    
99
    if (DreiZweiEins > 3000) //Wenn erste drei Sekunden gezählt dann die DreiZweiEins_func nicht mehr aufrufen
100
    {
101
    LedRotAnAus();
102
    LedGelbAnAus();
103
    }
104
    else
105
    DreiZweiEins_func();
106
    
107
  }

von holger (Gast)


Lesenswert?

volatile uint16_t DreiZweiEins = 0;

von Michael F. (frettchen1982)


Lesenswert?

Äh, wie darf ich das Verstehen?

Heisst, wenn mein AVR laufen würde, dann würde die Funktion 
DreiZweiEins_func die die Variable nich raus rücken um diese in der ISR 
zu verarbeiten?

von holger (Gast)


Lesenswert?

>volatile uint16_t DreiZweiEins = 0;

Ach Quatsch;)

>Nanu? Nochmal veruscht zu flashen. Fehlermeldung. Keine Verbindung mehr
>möglich. Lesen? Nichts! Fuses lesen? Nichts.
>
>Bascom an: Kein Chip erkannt!
>
>Alles aus, wieder an: Nichts.

Verfused. Wahrscheinlich mit dem Popelprogrammer auf externen Takt
oder Crystal Osc programmiert. Leg doch mal einen Takt von 1MHz an 
XTAL1.

von Michael F. (frettchen1982)


Lesenswert?

holger schrieb:
>>volatile uint16_t DreiZweiEins = 0;
>
> Ach Quatsch;)
>

Also richtig?

>>Nanu? Nochmal veruscht zu flashen. Fehlermeldung. Keine Verbindung mehr
>>möglich. Lesen? Nichts! Fuses lesen? Nichts.
>>
>>Bascom an: Kein Chip erkannt!
>>
>>Alles aus, wieder an: Nichts.
>
> Verfused. Wahrscheinlich mit dem Popelprogrammer auf externen Takt
> oder Crystal Osc programmiert. Leg doch mal einen Takt von 1MHz an
> XTAL1.

Das kann passieren nachdem das Ding mehr als 100 mal richtig geflasht 
hat? Dann muss ich mal die nächste Bestellung abwarten. Hab nix da was 
Takt macht. Mit nem Taster bin ich nicht do flott :-)

Sonst keine Möglichkeiten?

von Martin K. (maart)


Lesenswert?

Mit deiner Lochrasterplatine ist auch alles in Ordnung?
Reset, Spannung usw. ?

von Karl H. (kbuchegg)


Lesenswert?

Michael F. schrieb:
> holger schrieb:
>>>volatile uint16_t DreiZweiEins = 0;
>>
>> Ach Quatsch;)
>>
>
> Also richtig?

Nein, nicht richtig.

Hat aber mit dem Problem nichts zu tun.
Das ausgefallene Blinkerbirnchen ist am Motorschaden sicher nicht 
schuld.

> Das kann passieren nachdem das Ding mehr als 100 mal richtig geflasht
> hat?

Popelprogrammer eben.

> Dann muss ich mal die nächste Bestellung abwarten. Hab nix da was
> Takt macht. Mit nem Taster bin ich nicht do flott :-)
>
> Sonst keine Möglichkeiten?

Muss noch nicht mal sein, dass es wirkich der Takt ist. Meistens ist er 
es.

von Michael P. (mpl)


Lesenswert?

Michael F. schrieb:
> Mit nem Taster bin ich nicht do flott :-)

Bohrmaschine :D


das z.b. 
http://www.rcgroups.com/forums/attachment.php?attachmentid=3541030
oder ein Quarzoszillator.

oder einen 2ten AVR und dort nen Pin toggeln

Aber ich vermute das eine kleinere Frequenz es auch tut. Stichwort: 
Astabiler Multivibrator

von holger (Gast)


Lesenswert?

Vieleicht auch nur ein Kabelbruch im ISP Kabel.

von Michael F. (frettchen1982)


Lesenswert?

Mal Danke für die Tips. Mit dem 555 ist ja ne gute Idee. Hat mir heute 
noch ein Kumpel was drüber erzählt. Habe nur die entsprechenden Bauteile 
wieder nicht hier rum. Muss mir eh noch ein paar Sachen bestellen. Da 
sind auch Quarze und weiter Megas dabei. Dann sollte ich das Problem in 
den Griff bekommen.

Am ISP Kabel dürfte es nicht liegen. Sauberes Flachband mit 
Wannensteckern und so. Wurde kum Bewegt und vor allem heute abend 
zwischen dem flashen garnicht.

von Karl H. (kbuchegg)


Lesenswert?

Michael F. schrieb:
> Mal Danke für die Tips. Mit dem 555 ist ja ne gute Idee. Hat mir heute
> noch ein Kumpel was drüber erzählt. Habe nur die entsprechenden Bauteile
> wieder nicht hier rum. Muss mir eh noch ein paar Sachen bestellen. Da
> sind auch Quarze und weiter Megas dabei. Dann sollte ich das Problem in
> den Griff bekommen.
>
> Am ISP Kabel dürfte es nicht liegen. Sauberes Flachband mit
> Wannensteckern und so. Wurde kum Bewegt und vor allem heute abend
> zwischen dem flashen garnicht.

Kennst du die berühmten letzten Worte :-)

Spannungsversorgung hast du kontrolliert?

von Michael F. (frettchen1982)


Lesenswert?

Karl Heinz Buchegger schrieb:

>
> Kennst du die berühmten letzten Worte :-)
>

Ich glaube, da gibt es viele Variationen :-)

> Spannungsversorgung hast du kontrolliert?

Jep. Das Ding ist ja eingelötet und LED zeigt an ob was drauf liegt oder 
nicht.

ISP habe ich auch mal getestet. Reset und so. Das funzt.

Ich kanns mir mit dem verfusen immer noch nicht erklären. Wenn ich 
Bauteile für einen Takt habe, dann wird getestet. Bin echt gespannt.

von Michael F. (frettchen1982)


Lesenswert?

Karl Heinz Buchegger schrieb:

>
> Popelprogrammer eben.
>


Jetzt mach den doch nicht so fertig. Der kann sich doch nicht wehren.

von cppler (Gast)


Lesenswert?

Michael F. schrieb:
> Karl Heinz Buchegger schrieb:
>
>>
>> Popelprogrammer eben.
>>
>
>
> Jetzt mach den doch nicht so fertig. Der kann sich doch nicht wehren.

Du aber schon :-P
Das Du noch einen realen physikalischen Parallelport hast, hmmm ...
Solltest Du das ganze allerdings via USB2Parallel machen ist da erstmal 
die Fehlerquelle zu suchen.
Einen USB Programmer der auch HV kann ist sowas vorzuziehen, eigene 
leidvolle Erfahrung ...
Mit welchem Programm hast du geflasht und welche Programmereinstellungen 
usw. waren das ?

von Thomas E. (thomase)


Lesenswert?

Michael F. schrieb:
> Karl Heinz Buchegger schrieb:
>
>> Popelprogrammer eben.
>
> Jetzt mach den doch nicht so fertig. Der kann sich doch nicht wehren.
So ein Mist kann auch mit einem der "Guten" passieren. Mein JTAGICE-MKII 
hat mir auch schon ein paar Chips zerledert. Ähnlich, wie du das auch 
schilderst: Bis eben gings noch.
100 Mal funktioniert, 1 mal nicht. Grausam. Und auch nur über SPI. JTAG 
und Debugwire waren kein Problem. Nun steckt man einen Programmer für 
knapp 300€ aber nicht einfach so in die Tonne. Doch irgendwann, ging es 
dann gar nicht mehr über SPI und JTAG machte auch Macken. Woran lag es? 
Natürlich am FPC-Kabel. Das hatte sich nun von "vermutlich nicht 
sichtbar rausgerutscht" auf "kaum sichtbar rausgerutscht" verändert.
Seither hat der nie wieder Fehler gemacht.

Jaja ich weiss, es soll Leute geben, die jeden Tag das Kabel 
kontrollieren.

Also die ganze LPT-Kabel-Programmer-Kabel-Kette ist schon verdächtig und 
kann durch dann fehlerhafte Befehle schon die Fuses so verbiegen, daß du 
ausgesperrt bleibst.

mfg.

von Lothar (Gast)


Lesenswert?

Auch wenn man das hier nicht gerne hört: für Anfänger empfiehlt sich ein 
MC mit ROM-Bootloader z.B. der LPC1114 als DIP. Wenn dann der Programmer 
mal nicht mehr zugreifen kann, kommt man immer noch über RS232 oder USB 
ran, um ein funktionsfähiges Programm zu flashen.

Beitrag "DIP-ARM Samples von Arrow"

von Michael F. (frettchen1982)


Angehängte Dateien:

Lesenswert?

Michael P. schrieb:
> Michael F. schrieb:
>> Mit nem Taster bin ich nicht do flott :-)
>
> Bohrmaschine :D
>
>
> das z.b.
> http://www.rcgroups.com/forums/attachment.php?attachmentid=3541030
> oder ein Quarzoszillator.
>
> oder einen 2ten AVR und dort nen Pin toggeln
>
> Aber ich vermute das eine kleinere Frequenz es auch tut. Stichwort:
> Astabiler Multivibrator

Hallo nochmal,

da ich bisher noch keine neuen Teile bestellt habe ich aber gern weiter 
experimentieren würde habe ich mal in meinem Elektroschrott geschaut.

Quarze habe ich satt, aber wenn ich das richtig verstehe, bringt mir das 
nichts da ich an XTAL1 ja einen Takt von einem Oszillator brauche. 
Soweit richtig?

So, nun habe ich einen NE556N gefunden, ja quasi ein doppelter 555. 
Somit wäre der astabile Multivibrator ja machbar.

Jetzt habe ich anhand vorhandener Elkos und Widerstände mal etwas 
gerechnet und bin dann darauf gekommen.

Elko 1µF
R1 100 Ohm
R1 470 Ohm

1,44/((0,100+(2x0,470))*0,000001)

= 1384615,38 = 1,385 MHz

Demnach könnte ich den Mega32 mit dem Takt laufen lassen und meine Fuses 
wieder richtig setzen?

Oder hab ich was nicht bedacht?

von Overclocker (Gast)


Lesenswert?

Michael F. schrieb: "Oder hab ich was nicht bedacht?"

Leider hast Du nicht bedacht, daß der NE555/556 keine 1384615,38 = 1,385 
MHz erzeugen kann. Die maximale Grenzfrequenz liegt, laut Datenblatt, 
bei 500kHz. Selbst die zu erzeugen ist schon sehr sportlich und 
erfordert extrem niederohmige Widerstände. Es ist aber auch nicht nötig 
hier neue Rekorde aufzustellen. Nimm irgendwas in der Gegend von 100kHz 
und werde glücklich. Am besten noch das Datenblatt bezüglich der Auswahl 
der frequenzbestimmenden Widerstände und Kondensatoren zu Rate ziehen. 
Das erspart unnötigen Frust.

von Michael F. (frettchen1982)


Lesenswert?

Overclocker schrieb:
> Michael F. schrieb: "Oder hab ich was nicht bedacht?"
>
> Leider hast Du nicht bedacht, daß der NE555/556 keine 1384615,38 = 1,385
> MHz erzeugen kann. Die maximale Grenzfrequenz liegt, laut Datenblatt,
> bei 500kHz. Selbst die zu erzeugen ist schon sehr sportlich und
> erfordert extrem niederohmige Widerstände. Es ist aber auch nicht nötig
> hier neue Rekorde aufzustellen. Nimm irgendwas in der Gegend von 100kHz
> und werde glücklich. Am besten noch das Datenblatt bezüglich der Auswahl
> der frequenzbestimmenden Widerstände und Kondensatoren zu Rate ziehen.
> Das erspart unnötigen Frust.

Nach deinem Beitrag ist es mir auch wieder gekommen das ich es im 
Datenblatt gelesen habe. In dem Beispiel weiter oben wird aber auch ca. 
1Mhz angegeben.

Aber der Mega32 läuft wieder und das ohne 555/556. Es geht noch viel 
einfacher. Ist mir gestern vor dem einschlafen eingefallen.

Habe einen USB to COM adapter genommen. GND/GND und DTR an XTAL1 
geklemmt und dann den PIN lt. Software mit 1ms 0/1 geschaltet. Real 
dürften das so 30ms gewesen sein. Aber es hat gereicht um Leben rein zu 
bringen und die Fuses neu zu setzten.

Aber dennoch vielen Dank für eure Hilfe. Durch den Vorfall habe ich doch 
einiges gelernt.

von Overclocker (Gast)


Lesenswert?

Super das es geklappt hat den MEGA32 zu reanimieren, auch wenn mir immer 
noch nicht klar ist, wie man durch eine C-Source Änderung die Fuses 
derartig verstellen kann. Weiterhin viel Spaß am Basteln.

von Michael F. (frettchen1982)


Lesenswert?

Overclocker schrieb:
> Super das es geklappt hat den MEGA32 zu reanimieren, auch wenn mir immer
> noch nicht klar ist, wie man durch eine C-Source Änderung die Fuses
> derartig verstellen kann. Weiterhin viel Spaß am Basteln.

Ich verstehe das auch nicht aber es könnte noch was anderes sein.

Ich habe ein altes Handynetzteil verwendet und auf der Platine einen 
7805. Nun hat das Netzteil aber nur 6, irgendwas V geliefert und am 
Mega32 kamen nur noch 4,2 V an bzw. in der ganzen Schaltung. In 
verbindung mit dem Selfmade Programmer könnte es dann durchaus 
passieren. Hab nun wieder ein 9V Netzteil dran und die Spannung stimmt 
auch wieder.

Ob es das nun war weis ich nicht, aber hauptsache er geht wieder.

von Simon K. (simon) Benutzerseite


Lesenswert?

Thomas Eckmann schrieb:
> Michael F. schrieb:
>> Karl Heinz Buchegger schrieb:
>>
>>> Popelprogrammer eben.
>>
>> Jetzt mach den doch nicht so fertig. Der kann sich doch nicht wehren.
> So ein Mist kann auch mit einem der "Guten" passieren. Mein JTAGICE-MKII
> hat mir auch schon ein paar Chips zerledert. Ähnlich, wie du das auch
> schilderst: Bis eben gings noch.
Das kann ich mir weder vorstellen, noch nachvollziehen bei mir. Ich 
würde an der Stelle den Fehler eher in der Schaltung suchen oder bei 
einem Wackelkontakt.

von Michael F. (frettchen1982)


Lesenswert?

Hallo nochmal.

Falls jemand das Tool benötigt um den Takt mit dem COM Port zu 
erzeugen..

http://www.file-upload.net/download-7163215/Taktgeber_COMPORT.rar.html

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.