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_tCountLedRot=0;
10
uint16_tCountLedGelb=0;
11
uint16_tDreiZweiEins=0;
12
13
14
15
voidLedRotAnAus(void);
16
voidLedGelbAnAus(void);
17
voidDreiZweiEins_func(void);
18
19
voidDreiZweiEins_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
voidLedGelbAnAus(void)
32
{
33
if(CountLedGelb==1000)
34
{
35
PORTC^=(1<<PC4);
36
CountLedGelb=0;
37
}
38
else
39
{
40
CountLedGelb++;
41
}
42
}
43
44
voidLedRotAnAus(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
intmain(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
Ä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?
>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.
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?
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.
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.
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?
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.
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 ?
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.
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"
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?
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.
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.
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.
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.
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.