PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fuse-Bits (Mega 32)



Mc Delta
16.05.2010, 11:49
Hallo,
Ich habe mir ein kleines Board mit einem Atmel Mega 32 aufgebaut. (siehe Bild)
http://i40.tinypic.com/rveg6f.jpg
Ich habe mir auch schon einen 16 Mega-Herz Quarz gekauft um die Taktfrequenz zu stabilisieren. Nur ist die Frage wie ich mit dem Programm: Pony Prog die Fuse-Bits so setze, dass der Quarz auch akzeptiert wird.
Bitte um Hilfe!!

Hubert.G
16.05.2010, 12:37
Es darf nur bei CKOPT und SPIEN ein Haken sein.
Hier ist eine gute Anleitung:
www.engbedded.com/fusecalc/

syn_error
16.05.2010, 13:26
es fehlt jeweils ein 100nf kerko an vcc/gnd und avcc/gnd.
http://rn-wissen.de/index.php/Abblockkondensator

Mc Delta
16.05.2010, 16:25
Erstmal Danke für die Antwort!
Ich habe mir mal die Seite mit dem Fuse-Rechner angescheut aber ich komme damit nicht klar. Eigentlich brauche ich doch nur die Information wo eine Null steht und wo eine eins steht, aber es gibt soviele unterschiedliche Einstllung, dass ich nicht weiß welche ich wählen soll.
Also kann mir jemand der sich damit auskennt oder der selbst positive Erfahrungen mit seinen Einstellungen für einen 16MHz Quarz am M32 bitte die Einstellungen bei Pony Prog posten?

Hubert.G
16.05.2010, 17:51
Eigentlich musst du nur wissen wo ein Haken hingehört, das habe ich dir geschrieben und steht auch im Fuse-Calk.

021aet04
16.05.2010, 21:09
Wie syn_error geschrieben hat brauchst du noch einen Kondensator (100nF/keramik) zumindest bei VCC. Am Besten ist es wenn du dich an das Designsheet von Atmel hältst (http://www.atmel.com/dyn/resources/prod_documents/doc2521.pdf). Der Entstörkondensator sollte so nah als möglich an das IC zwischen VCC und GND.

MfG Hannes

Mc Delta
17.05.2010, 13:57
@ Hannes,
Der 100nF Kerko ist bereits vorhanden. Er wird als Entstörkondensator genutzt und ist zwischen VCC und GND geschaltet.

Mc Delta
17.05.2010, 14:14
Danke an Hubert,
Ich habe die Fusebit-configuration so übernommen wie du beschrieben hast und es klappt!
Mich hat vorher nur der Haken bei SPIEN irritiert, weil der ja nichts mit der Einstellung von dem Takt zu tun hat.

Mc Delta
17.05.2010, 14:28
Hier nochmal ein aktuelles Bild mit einem steckbaren 4 MHz Quarz.
http://i42.tinypic.com/73gsqh.jpg

syn_error
17.05.2010, 22:56
Der 100nF Kerko ist bereits vorhanden. Er wird als Entstörkondensator genutzt und ist zwischen VCC und GND geschaltet.
will ja nicht pingelig sein aber auf dem letzten bild sehe ich keinen kerko am atmega oder versteckt der sich auf der rückseite?


Mich hat vorher nur der Haken bei SPIEN irritiert ...
die SPIEN fuse bit ist nur per hv programmer schaltbar, mit isp hat man eh keinen zugriff darauf.

Mc Delta
18.05.2010, 13:49
@ syn_error,
Den Keramik Kondensator siehst du links neben dem IC 74HC244N!

syn_error
18.05.2010, 16:18
der ist ja einen halben meter weit weg!
siehe: www.atmel.com/atmel/acrobat/doc2521.pdf

Mc Delta
18.05.2010, 17:10
Ja,
die Infrastruktur ließ es nicht anders zu. Aber es funktioniert ja.

Hubert.G
18.05.2010, 19:43
Solange du keine Störungen drauf bekommst, wird es schon funktionieren. Irgendwann aber nicht mehr, ob du dann weisst warum?

Mc Delta
18.05.2010, 19:55
Warum sollte es irgendwann nicht mehr funktionieren?

Hubert.G
18.05.2010, 20:04
Das es gar nicht mehr funktioniert ist eher unwahrscheinlich, aber es kann zu undefinierten Störungen kommen, zu Reset die du nicht erkennst usw.
Mit richtig plazierten Kondensatoren kann man da schon einen erheblichen Teil der Fehlerquellen eliminieren.

Mc Delta
19.05.2010, 13:51
Aber der Kerko ist doch recht nah am Mega 32!?

Hubert.G
19.05.2010, 15:14
Nahe ist bis zu max. 1cm am Pin.

Mc Delta
19.05.2010, 19:57
Ich habe keine Lust die Schaltung deswegen umzubasteln. Kann ich nicht einfach einen 2. 100 nF Kerko davor setzen?

Hubert.G
19.05.2010, 20:34
Natürlich kannst du das machen.

Mc Delta
20.05.2010, 13:05
Eigentlich wollte ich wissen ob es was bringt. Aber die Ursache der meisten Missverständnisse liegt wohl bei der unklar gestellten Fragen.

Hubert.G
20.05.2010, 14:29
Natürlich bringt ein zusätzlicher richtig platzierter Kondensator etwas. Es ist nicht so das seine Funktion durch einen schlecht platzierten wieder aufgehoben wird.

Mc Delta
20.05.2010, 14:49
Noch mal eine Frage zu dem Quarz:
Ich hae deine Fuse-bits gestzt, aber wenn ich jetzt einen 16MHz-Quarz einsetze blinken die LEDs die normalerweise alle 100ms blinkensolten erheblich schneller. was kann ich dagegen machen?

Richard
20.05.2010, 14:55
Die richtigen Fuse Bit´s setzen?

Gruß Richard

Hubert.G
20.05.2010, 15:01
Ich denke nicht das es etwas mit den Fuse Bits zu tun hat.
Zeig mal den Code.

Mc Delta
20.05.2010, 17:53
Hier ist der Code:



#ifndef MCU
#define MCU atmega32
#endif

#ifndef F_CPU
#define F_CPU 16000000UL
#endif

#include <avr/io.h>
#include <util/delay.h>

uint8_t Geschwindigkeit = 100;
uint8_t i = 0;
uint8_t v = 0;
void run (void)
{
while (i < 20)
{
PORTC = 0b00000001;
_delay_ms(Geschwindigkeit);
PORTC = 0b00000010;
_delay_ms(Geschwindigkeit);
PORTC = 0b00000100;
_delay_ms(Geschwindigkeit);
PORTC = 0b00001000;
_delay_ms(Geschwindigkeit);
PORTC = 0b00010000;
_delay_ms(Geschwindigkeit);
PORTC = 0b00100000;
_delay_ms(Geschwindigkeit);
PORTC = 0b01000000;
_delay_ms(Geschwindigkeit);
PORTC = 0b10000000;
_delay_ms(Geschwindigkeit);
i++;
}
}
void crash (void)
{while (v < 20)
{
PORTC = 0b10000001;
_delay_ms(Geschwindigkeit);
PORTC = 0b01000010;
_delay_ms(Geschwindigkeit);
PORTC = 0b00100100;
_delay_ms(Geschwindigkeit);
PORTC = 0b00011000;
_delay_ms(Geschwindigkeit);
PORTC = 0b00100100;
_delay_ms(Geschwindigkeit);
PORTC = 0b01000010;
_delay_ms(Geschwindigkeit);
PORTC = 0b10000001;
_delay_ms(Geschwindigkeit);
PORTC = 0b00000000;
_delay_ms(Geschwindigkeit);
v++;
}
}
int main(void)
{
DDRC = 0b11111111;

PORTC = 0b11111111;
_delay_ms(2000);

while (v < 9999999)
{
run();
crash();
v++;
}

}

Hubert.G
20.05.2010, 18:12
The maximal possible delay is 262.14 ms / F_CPU in MHz
When the user request delay which exceed the maximum possible one, _delay_ms() provides a decreased resolution functionality. In this mode _delay_ms() will work with a resolution of 1/10 ms,
Es dürfen auch keine Variablen für die Zeit eingesetzt werden, bei dir hier allerdings kein Problem, da der Wert der Variablen bereits zur Kompilezeit bekannt ist.

Mc Delta
21.05.2010, 13:10
Ich habe jetzt 262.14/16 gerechnet. Das Ergebnis war 16.38375. Heißt das, dass ich, um auf 100ms zu kommen, ca. 6 mal die delay-Funktion aufrufen mass?

Hubert.G
21.05.2010, 13:28
Wenn du 10 mal 10ms aufrufst, am besten in einer Schleife, dann hast du 100ms.
Ein Timer ist aber die bessere Lösung

Mc Delta
21.05.2010, 13:51
Ich habe noch nicht vil mit timern gearbeitet. Aber im Prinzip müsste man den Timer starten können und dann den Status abfragn können um eine Aktion auszulösen?!

Hubert.G
21.05.2010, 15:02
Du stellst den Timer auf z.B. 10msec, zählst bis 10 mit und löst dann deine Aktion aus.

Mc Delta
21.05.2010, 16:32
sorry,
aber ich habe keine ahnung wie das Programm dafür aussehen muss.
Ich schreibe in C auf einen Mega32. Kannst du bitte das Grundgerüst, was du eben erklärt hast als Code hier reinstellen.
Danke!

Hubert.G
21.05.2010, 20:01
#include <avr/io.h>
#include <avr/interrupt.h>

volatile unsigned char time;

ISR(TIMER1_COMPA_vect){ /* ISR Timer1 Output Compare Match */
time++; /* Variable wird um 1 erhöht */
}



int main(void){

DDRD=0xff; /* Gesamtes PortD ist Ausgang */
OCR1A=625; /* Compare Match Wert, ergibt mit Prescaler einen 10msec Takt */
TIMSK=(1<<OCIE1A); /* Compare Match freigeben */
TCCR1B= (1<<WGM12)|(1<<CS12); /* Compare Match, Prescaler /256 */

sei();

for(;;){
if (time>=100){ /* Takt mal 100 ergibt 1sec */
PORTD^=(1<<PD5); /* PortD5 wird getoggled */
time=0; /* time auf 0 stellen */
}
}
}


Das ergibt ein blinken einer Led an PD5 im Sekundentakt.

Mc Delta
22.05.2010, 21:28
Danke für deine Antwor!
Ich habe das Prinzip verstanden, aber ich verstehe nicht was Compare Match bedeutet und was es bewirkt. Der Prescaler ist doch der Teilungsfaktor?! Ich habe nur nach nicht verstanden wie ich den festlege. Könntest du das bitte mal an dem Beispiel für Prescaler 16 erklären?
Das wäre wirklich super.

Hubert.G
22.05.2010, 21:52
Einen Prescaler 16 gibt es nicht. Der Prescler wird im Register TCCR1B ausgewählt. Schau dazu ins Datenblatt Seite 108.
Compare Match bedeutet das der Timer nicht bis ans Ende, also 65535 zählt, sondern nur bis zu dem im Register OCR1A angegebenen Wert. Dann löst er den Interrupt aus und beginnt er wieder von 0.

Mc Delta
23.05.2010, 07:56
Also kann ich den Prescaler nur auf 1, 8, 64, 256, oder 1024 festlegen?
Gibt es auch noch eine andere Schreibweise als (1<<WGM12)|(1<<CS12); Das sieht so kompliziert aus. Wie würde TCCR1B bei einem Prescaler von 64 aussehen? Oder gibts irgendwo eine Tabelle in der man das nachlese kann? Im Datenblatt habe ich nichts gefunden.

oberallgeier
23.05.2010, 08:28
... gibts irgendwo eine Tabelle ... Im Datenblatt habe ich nichts gefunden ...Welches Datenblatt hast Du denn??? Im 8155A–A VR–06/08, das ist in meinen Unterlagen das Neueste zum m32, steht z.B. auf Seite 114 Table 16-5. Waveform Generation Mode Bit Description und gleich drunter sind die Bits für das TCCR1B genau und ausführlich beschrieben. Gleich danach, auf S 116 sind in Table 16-6. Clock Select Bit Description die Prescaler exakt aufgelistet . . . .

Mc Delta
23.05.2010, 18:07
Ich hatte tatsächlich ein anderes Datenblatt. (Mega 32L) Jetzt habe ich mir das von Mega 32 A runtergeladen und die von dir Beschriebene Tabelle gefunden.
Danke!

Mc Delta
23.05.2010, 18:27
CS12 CS11 CS10 Description
0____0____0____No clock source (Timer/Counter stopped).
0____0____1____clkI/O/1 (No prescaling)
0____1____0____clkI/O/8 (From prescaler)
0____1____1____clkI/O/64 (From prescaler)
1____0____0____clkI/O/256 (From prescaler)
1____0____1____clkI/O/1024 (From prescaler)
1____1____0____External clock source on T1 pin. Clock on falling edge.
1____1____1____External clock source on T1 pin. Clock on rising edge.

Mc Delta
23.05.2010, 19:19
Hallo nochmal,
Ich habe den Code von Hubert weitgehend übernommen und in den M32 geladen, doch es leuchtet nicht eine einzige LED. was kann ich machen? Findet vielleicht einer von euch irgendeinen Fehler?


#ifndef MCU
#define MCU atmega32
#endif

#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <avr/interrupt.h>

volatile unsigned char time;

ISR(TIMER1_COMPA_vect){ /* ISR Timer1 Output Compare Match */
time++; /* Variable wird um 1 erhöht */
}



int main(void){

DDRC=0b11111111; /* Gesamtes PortD ist Ausgang */
OCR1A=625; /* Compare Match Wert, ergibt mit Prescaler einen 10msec Takt */
TIMSK=(1<<OCIE1A); /* Compare Match freigeben */
TCCR1B= (1<<WGM12)|(1<<CS12); /* Compare Match, Prescaler /256 */
sei();

while(1)
{
if (time>=100)
{ /* Takt mal 100 ergibt 1sec */
PORTC=0b11111111; /* PortD5 wird getoggled */
time=0; /* time auf 0 stellen */
}
}
}

PS: Es wurden auch keine Errors angezigt.

Hubert.G
23.05.2010, 19:38
PORTC^=(1<<PC5); /* PortD5 wird getoggled */

So sollte diese Zeile aussehen, sonst wird nicht getoggled.

IN den Fuses JTAG löschen.

Mc Delta
24.05.2010, 09:49
JTAG ist schon deaktiviert. Ich habe die Zeile in der getoggled wird jetzt von dir übernommen aber es leuchtet immer noch keine LED auf.

Hubert.G
24.05.2010, 10:01
Ich habe das Programm von dir noch mal in mein Testboard geladen, die LED blinkt.
Da musst du noch einen anderen Wurm drinnen haben.

Mc Delta
24.05.2010, 11:43
Mit oder ohne deiner Verbesserung?

Hubert.G
24.05.2010, 15:59
ICh habe nur diese Zeile ausgetauscht:
PORTC^=(1<<PC5);

Mc Delta
24.05.2010, 18:46
Ich habe also im Programm keine Fehler, denn ich habe ja den selben Code wie du in den M32 geladen. (Die Zeile ist auch genau wie bei dir ausgetauscht.) Benutzt du vieleicht keinen Quarz oder einen Quarz ungleich 16MHz? Könntest du evt. zur absuluten Sicherheit den C-Code posten den du compiliert hast?

PS: Meine LED funktioniert.

Hubert.G
24.05.2010, 19:49
Hier die *.hex wie sie bei mir funktioniert.

Mc Delta
24.05.2010, 20:48
Komisch, das hat jetzt geklappt. Die Hex-Datei bringt mir aber nicht viel. könntest du bitte den C-Code posten?

oberallgeier
24.05.2010, 22:20
Ich habe also im Programm keine Fehler ...Nicht nur dieser, auch anderen Formulierungen stehe ich misstrauisch gegenüber, seit mir vor vielen Jahren aufgefallen war, dass die meisten Unfall- oder Katastrophenberichte etwa so beginnen: "Nach Meinung aller kompetenten Fachleute war ... alles richtig ...". Es wird allgemein anerkannt, dass die Abwesenheit von Fehlern, also die gesicherte Fehlerfreiheit, garnicht beweisbar ist. Dazu müsste der Tester nämlich 1. alle möglichen Fehler kennen und 2. deren Abwesenheit unter allen möglichen (nicht nur denkbaren) Bedingungen zweifelsfrei beweisen. Dies gilt insbesondere bei der Softwareentwicklung, siehe zum Beispiel hier, (http://de.wikipedia.org/wiki/Softwaretest#Ziele) dritter Satz.

Mc Delta
25.05.2010, 06:58
Ja und genau deswegen bat ich um eine absulute Sicherheit, die mir der C-Code von Hubert garantieren soll.

Hubert.G
25.05.2010, 08:20
#ifndef MCU
#define MCU atmega32
#endif

#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <avr/interrupt.h>

volatile unsigned char time;

ISR(TIMER1_COMPA_vect){ /* ISR Timer1 Output Compare Match */
time++; /* Variable wird um 1 erhöht */
}



int main(void){

DDRC=0b11111111; /* Gesamtes PortD ist Ausgang */
OCR1A=625; /* Compare Match Wert, ergibt mit Prescaler einen 10msec Takt */
TIMSK=(1<<OCIE1A); /* Compare Match freigeben */
TCCR1B= (1<<WGM12)|(1<<CS12); /* Compare Match, Prescaler /256 */
sei();

while(1)
{
if (time>=100)
{ /* Takt mal 100 ergibt 1sec */
PORTC^=(1<<PC5); /* PortD5 wird getoggled */
time=0; /* time auf 0 stellen */
}
}
}
In diesem Code ist gegenüber deinem nur diese eine Zeile geändert.
Wenn es wieder nicht klappt, dann schick mir mal dein *.hex File zum vergleichen.

Mc Delta
25.05.2010, 10:15
Hat nicht geklappt. Ich compiliere mit AVR-Studio.

Hubert.G
25.05.2010, 12:11
Dein *.hex funktioniert nicht. Es ist aber schon ein Unterschied in der Größe, meines hat 594 Byte deines hat 819 Byte.
Sind alle Einstellungen im AVR-Studio richtig, was für eine GCC-Version, richtiger Kontroller eingestellt.

Mc Delta
25.05.2010, 14:52
Version 4.18!
In dem "Build-Bericht" steht allerdings was von Mega128. Wie kann ich das ändern?

oberallgeier
25.05.2010, 15:49
Steht hier. (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=483105&sid=c387775cc150ca7853c774a944c7473d#483105)

Mc Delta
25.05.2010, 17:14
Das hat mir nicht weitergeholfen, aber ich habe es trotzdem geschafft. Ich habe als Device den M32 ausgewählt und das Programm compiliert. Erfolgreich. Die LED blinkt.