7-Segmentanzeige: Atmega8 zeigt was anderes an!

Gast #1481933
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
Angehängte Dateien:
#1481944
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.
Gast #1482143
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.
Gast #1482266
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?
Angehängte Dateien:
#1482296
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.
Gast #1482407
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?
#1482439
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
Gast #1482442
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?
Gast #1482443
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.
Gast #1482791
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...
Angehängte Dateien:
Gast #1482990
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.
Gast #1483177
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.
Gast #1483232
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?
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren