Forum: Compiler & IDEs 7-Segmentanzeige: Atmega8 zeigt was anderes an!


von Alois (Gast)


Angehängte Dateien:

Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Gustav K. (hanibal)


Lesenswert?

villeicht ist das letzute bit ja der punkt?

von Rolf Magnus (Gast)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

Alois schrieb:
> (getestet im STK 500)

Dass die LEDs dort low-aktiv (0 = an, 1 = aus) sind, hast du bedacht?

von Alois (Gast)


Lesenswert?

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.

von Alois (Gast)


Lesenswert?

An Stefan:

Danke für den Hinweis, daß sie lowaktiv sind, hab ich nicht bedachtt. 
Trotzdem kommt ja irgendwas raus und nicht das Komplement.

von Karl H. (kbuchegg)


Lesenswert?

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?

von Alois (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Alois (Gast)


Lesenswert?

Zusatz:

CASE 0: 0b00000000;

dient nur zum Testen. Ich weiß, dass das keine 0 ist :)

von Stefan E. (sternst)


Lesenswert?

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.

von Alois (Gast)


Lesenswert?

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).

von Alois (Gast)


Lesenswert?

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?

von Alois (Gast)


Lesenswert?

ist das normal, daß der Mega8 innerhalb weniger Sekunden so heiß wird, 
daß man ihn mit dem Finger nicht mehr gerühren kann??

von avr (Gast)


Lesenswert?

Hast du auch den Jumper XTAL abgezogen? Nur Fuses setzen reicht
nicht.

avr

von Alois (Gast)


Lesenswert?

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?

von Naja (Gast)


Lesenswert?

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.

von Naja (Gast)


Lesenswert?

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.

von Naja (Gast)


Lesenswert?

>Also an der Hardware kanns nicht liegen...

Eines der berühmten letzten Worte, so wie "Rechts kommt keiner" und 
"Gestern ging es noch".

von Peter D. (peda)


Lesenswert?

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

von Alois (Gast)


Lesenswert?

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?

von Naja (Gast)


Lesenswert?

>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.

von Alois (Gast)


Angehängte Dateien:

Lesenswert?

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...

von Rolf Magnus (Gast)


Lesenswert?

> 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.

von Alois (Gast)


Lesenswert?

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.

von avr (Gast)


Lesenswert?

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

von Alois (Gast)


Lesenswert?

Danke für den Link, werd ich mal lesen.
Was ich will, ist mir klar. Ic will den gesamten Port nutzen.

von Rolf Magnus (Gast)


Lesenswert?

Wenn du den eingebauten Oszillator verwenden willst, mußt du an den 
Fuses gar nichts einstellen. Der ist schon voreingestellt.

von Naja (Gast)


Lesenswert?

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.

von Alois (Gast)


Angehängte Dateien:

Lesenswert?

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

von Naja (Gast)


Lesenswert?

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.

von Alois (Gast)


Lesenswert?

danke das wars. Thread kann geschlossen werden.

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.