hallo, hab soeben mein erstes Progi auf einem Atmega8 geschrieben und lt. Simulator macht es auch das, was es soll. Jedoch die HArdware nicht (getestet im STK 500). Hier reagiert zwar die richtige Taste des PORTD, aber es leuchten immer die falschen LEDs, diese widerkehren zwar jedesmal (9 mal) gleich, aber eben die falschen! Was hab ich falsch gemacht? Anbei der Source. Alois
Ohne das jetzt grossartig analysiert zu haben: Ich denke nicht, dass das hier
1 | if (PIND & 0x01 & merker==0) |
das macht was du dir vorstellst (was immer du denkst das es machen würde)
1 | case 1: |
2 | PORTB = 0b01001001; |
3 | break; |
Hä? Wenn eine 1 angezeigt werden soll, leuchten doch auf einer 7-Segmentanzeige keine 3 Anzeigeelemente auf. Du musst hier einstellen, welche Segmente deiner Anzeige eingeschaltet werden soll, wenn myVar eine der Zahlen von 0 bis 9 enthält. Wo sind eigentlich die cases für die Fälle 8 und 9? Mach dir eien Zeichnung, auf der die 7 Segmente der Anzeige drauf sind +--------+ | | | | | | | | +--------+ | | | | | | | | +--------+ dann stellst du fest, welches Segment aufleuchtet, wenn du am PORTB 1(!)Bit auf 1 setzt und schreibst das daneben hin. zb PB1 +--------+ | | PB2 | | PB4 | | | PB5 | +--------+ | | PB3 | | PB6 | | | PB7 | +--------+ wenn du daher eine 3 anzeigen willst, mussen dieses Elemente eingeschaltet werden: PB1 +********+ | * PB2 | * PB4 | * | PB5 * +********+ | * PB3 | * PB6 | * | PB7 * +********+ also PB1, PB4, PB5, PB6 und PB7 auf 1, alles andere auf 0. ergo PORB = 0b11110010; // Segmente für '5' einschalten Bei dir werden sich natürlich andere Bitkombinationen ergeben. Schliesslich habe ich jetzt einfach nur ein Anschlussschema erfunden.
Der hat gar nichts mit der Anzeige zu tun. Ist doch sogar im Code kommentiert:
1 | DDRB = 0b11111110;//alles Ausg�nge au�er Pin0 |
2 | PORTB |= 0b00000001;//f�r Eingang 0 den interen PullUp aktivieren |
Alois schrieb: > (getestet im STK 500) Dass die LEDs dort low-aktiv (0 = an, 1 = aus) sind, hast du bedacht?
ja genau, das Bit0 von PORTB sollte (zumindest ursprünglich ) der Schalter sein, der mir die Zahl um 1 erhöht. Dann hab ich den Schalter versuchsweise auf PORTD gehängt. Die Anzeige läuft weiterhin über PORTB, Bit 1 bis 8. Ich hab die Anzeige auch im Code kommentiert (nach der Switch). Versuchsweise hab ich unter CASE 1 einemal alle Bits eingeschaltet, also PORTB = 255. Zrotzdem leuchtet dasselbe wie vorher (0b00110110 statt 0b11111111). Und genau das versteh ich nicht. Im Simulator schauts richtig aus.
An Stefan: Danke für den Hinweis, daß sie lowaktiv sind, hab ich nicht bedachtt. Trotzdem kommt ja irgendwas raus und nicht das Komplement.
Fang erst mal einfacher an :-) (Deine ganze Tastenauswertung ist Müll)
1 | #include <avr/io.h> |
2 | |
3 | int main(void) |
4 | {
|
5 | DDRB = 0b11111110;//alles Ausg䮧e auߥr Pin0 |
6 | |
7 | PORTB = 0b10101010; |
8 | |
9 | while( 1 ) |
10 | ;
|
11 | }
|
Leuchten die richtigen LED?
Kleiner Code Update: Der Atmel macht schon das, was er soll nur er macht keine Ausgabe auf die letzen beiden LEDs am PortB, also wenn ich PORTB = 0b00000000 schreibe, sollen alle leuchten, jedoch leuchten nur die ersten 6. Die LEDS sind aber nicht kaputt, das weiß ich. Also wenn ich mnit dem Taster am PortD durchschalte, werden jetzt die richtigen Segmente angesteuert, außer die beiden letzten. Die rühren sich nicht. Bloss warum?
Zusatz: CASE 0: 0b00000000; dient nur zum Testen. Ich weiß, dass das keine 0 ist :)
Alois schrieb: > Der Atmel macht schon das, was er soll nur er macht keine Ausgabe auf > die letzen beiden LEDs am PortB, also wenn ich PORTB = 0b00000000 > schreibe, sollen alle leuchten, jedoch leuchten nur die ersten 6. Die > LEDS sind aber nicht kaputt, das weiß ich. Ähm, wie wird denn der Mega8 getaktet? B6 und B7 sind auch die Anschlüsse für einen Quarz.
der Mega8 wird intern (1Mhz) getaktet lt. Fuses. Ich hab probehalber mal den PORB auf PORTC umgeschrieben, aber da ist dasselbe (außer daß die LEDs nun heller leuchten).
So, hab das meiste im Code auskommentiert:
1 | int main(void) |
2 | {
|
3 | |
4 | // Achtung: alle Ein- und Ausgänge sind beim STK500 AKTIV LOW!!
|
5 | |
6 | uint8_t zahl; |
7 | uint8_t merker; |
8 | merker = 0; |
9 | zahl = 0; |
10 | |
11 | DDRB = 0b11111111; //alles Ausgänge |
12 | |
13 | PORTB = 0; |
14 | return(0); |
15 | }
|
selbst dieser Code setzt nur die ersten 6 Ausgänge, und die beiden anderen nicht. Was läuft da schräg?
ist das normal, daß der Mega8 innerhalb weniger Sekunden so heiß wird, daß man ihn mit dem Finger nicht mehr gerühren kann??
Hast du auch den Jumper XTAL abgezogen? Nur Fuses setzen reicht nicht. avr
ich hab jetzt einen anderen Mage8 (neu) ausprobiert, wird genauso heiß und das PRogramm in diesem neuen Mega8 läuft gleich ab und setzt ebenfalls die beiden letzten LEDs nicht. Kabel vom Port Ausgang zu den Leds hab ich auch schon ausgetauscht. Also an der Hardware kanns nicht liegen... Irgendwer eine Idee?
Mir wird nicht klar, ob Du jetzt für diese Basis-Tests Deine Siebensegment-Anzeigen verwendest oder die LEDs auf dem STK500. Falls Du die Siebensegment-Anzeigen benutzt, versuche bitte mal die LEDs die man mittels Flachbandkabel und Stecker (liegt beim STK500 bei) an Port B anschliessen kann.
Heiss? Ach Du grosser Turing! Da musst Du doch ein Problem an der Hardware haben. Schau mal genau die Beschreibung des STK500 an und überprüf noch mal alles.
>Also an der Hardware kanns nicht liegen...
Eines der berühmten letzten Worte, so wie "Rechts kommt keiner" und
"Gestern ging es noch".
Alois schrieb: > ist das normal, daß der Mega8 innerhalb weniger Sekunden so heiß wird, > daß man ihn mit dem Finger nicht mehr gerühren kann?? Dann hast Du Ausgänge kurzgeschlossen oder LEDs ohne Vorwiderstand dran. Selbst bei 20MHz darf eine Erwärmung nicht fühlbar sein. Nur ein Thermometer mit 0,1° Auflösung könnte sie feststellen. Und wenn Du mal ins Datenblatt des Mega8 schaust, wirst Du sehen, daß PB6/7 auch XTAL1/2 sind. D.h. beim STK500 mußt Du sie an PORTE/AUX abgreifen. Steht bestimmt auch im AVRStudio, Help, Tools Users Guide, STK500. Peter
ich hab die 3 Kabeln gesetzt so wie es in derAVR Anleitung zum STK stand, eins vom ISP6PIN zum SPROG2, um den Mega8 zu programmieren, die beiden anderen verbinden PORTB und PORTD mit den Schaltern und LEDs am Board. Ich verwende die LEDs und keine 7 Seg-Anzeige. Ich verwende den MEga8L um genau zu sein. Ich werwende ein 12 Volt Netzteil, um das Board zu versorgen. MEhr muß man auch schon nicht einstellen. Zumindest, was ich gelesen hab. Oder? Wie warm darf denn der Mega8 werden?
>Und wenn Du mal ins Datenblatt des Mega8 schaust, wirst Du sehen, daß >PB6/7 auch XTAL1/2 sind. D.h. beim STK500 mußt Du sie an PORTE/AUX >abgreifen. Eigentlich sollte der TO das wissen, denn er schrieb auf eine entsprechende Frage: >der Mega8 wird intern (1Mhz) getaktet lt. Fuses. Nur, auf die Frage ob der entsprechende Jumper auf dem STK500 abgezogen ist, hat er nicht geantwortet.
nein, auf die Frage, ob der Jumper abgezogen ist, hat er nicht geantwortet, weil ers überlesen hat die Frage :) Ich hab nun den XTAL1 Jumper abgezogen, nun wird der Mega nicht mehr warm. Aber dafür fukntioniert das Progi auch gar nimmer. Er gibt auch bei den Fuses 100 Einträge, die man auswählen kann Clocksource. Weiß jemand, was ich hier auswählen muß? Er läßt sich jetz auch nicht mehr programmieren, bekommenimmer die Fehlermeldung im Anhang...
> Wie warm darf denn der Mega8 werden?
Gar nicht. Wenn er so heiß geworden ist wie beschrieben, ist die
Wahrscheinlichkeit, daß er dabei Schaden genommen hat, ziemlich hoch.
o. Ich hab einen anderen reingesteckt, der läßt sich programmieren. Allerdings läuft das Programm nicht mehr also es wird nicht mehr getaktet. Man sieht zwar den Einschaltzustand (also die 6 LEDS leuchten), aber es tut sich nix. Er läuft nicht zyklisch. D.d. wohl daß der Takt fehlt. Mir istafgefalle, wenn ich XTAL1 wegnehme, leuchte die Leds viel heller als wenn er drauf ist. Als ob irgendwo zu viel Strom gezogen wird. Wenn ich den XTAL1 setze und den OSCSEL wegnehme, leuchten sie genauso hell. Alle anderen Jumperstellungen ziehen zuviel Strom und die Leds leucten schwach. Ich hab nun gelesen, daß man 3 Mögliochkeiten hat, den yC Takt zu setzen. 1. STK500 taktet den Mega über eingebauten Oszillator (XTAL1 gesetzt, OSCSEL gesetzt auf 12) 2. STK500 taktet den Mega über Software (XTAL1 gesetzt, OSCSEL gesetzt auf 23) 3. Mega8 nimmt eingebauten OScillator (XTAL1 offen, OSCSEL ? weiß ich nicht) Wie stelle ich jetzt die Fusebits korrekt ein. Da gibt es sehr viele Einträge? Bitte um Unterstützung.
Erster Tipp: Datenblatt ;) weiter: http://www.mikrocontroller.net/articles/AVR_Fuses Hilfsfunktion vom Studio Werde dir erst mal klar was du willst, kpl. PortB nutzen oder Genauigkeit durch Quarz. avr
Danke für den Link, werd ich mal lesen. Was ich will, ist mir klar. Ic will den gesamten Port nutzen.
Wenn du den eingebauten Oszillator verwenden willst, mußt du an den Fuses gar nichts einstellen. Der ist schon voreingestellt.
Nun, am besten kontrollierst Du die Fuses trotzdem, denn Du hast sie vielleicht verstellt. Aus der Schaltplanskizze ist erkennbar, das der XTAL1 Jumper die Verbindung von der Takterzeugung auf dem STK500 zum uC kontrolliert. Daher ist es, wenn XTAL1 offen ist, völlig egal wie der OSCSEL-Jumper steht. Zugegeben, man könnte vermuten, das dieser Jumper noch andere Auswirkungen hat, aber die hat er nicht. Dem AVR-Studio ist völlig egal wie der Jumper steht. Wenn Du Dir nun die Liste der möglichen Kombinationen für die Takt-Fuses anschaust, wirst Du feststellen, das sie benannt sind. Du musst also nur die Kombination wählen die Deiner Situation entspricht. Mehr ist nicht dahinter.
@Rolf: an den Fuses hatte ich nichts verändert, siehe Bild. Allerdings war Default der int. Oscillator eingestellt und ich wußte bis dato nicht, daß man dann auch den Jumper XTAL1 entfernen muß. @Naja: siehe Bild2. Wenn ich mit dem beim Mega eingebauten Oszillator arbeiten möchte, muß ich den ersten Eintrag auswählen und den XTAL1 entfernen. Dann kann ich auch PD6 und PD7 verwenden. Stimmt das?
Was an "Int. RC Osc." verstehst Du denn, verfl...t nochmal, nicht? Jetzt lies doch mal das verd...te Datenblatt und die Hilfetexte. Wir helfen wenn Du uns sagst, was Du nicht verstehst. Aber lesen und vor allem entscheiden musst Du alleine.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.