Forum: Mikrocontroller und Digitale Elektronik Bascom: atmega8-16pu verhält sich anders als atmega8-8pu


von Asdf A. (vampire05)


Lesenswert?

Hallo Zusammen,

ich versuche in Bascom eine TM1637 7-Segment Anzeige anzusteuern. das 
klappt hervorragend mit dem Atmega8-8PU. Sobald ich den Code auf den 
Atmega8-16PU flashe geht es nicht mehr. Ich sehe, dass der Controller 
arbeitet: Eingaben werden gelesen und Serial out geht auch wunderbar, 
aber nicht der TM1637. Habt iht eine Idee woran es liegen könnte?


Hier der Code:
$regfile = "m8def.dat"
$framesize = 32
$swstack = 32
$hwstack = 64

$crystal = 1000000     'Resonatorfrequenz
$baud = 9800           'Baudrate (Übertragungsgeschwindigkeit)
Baud = 9800


dim z as integer
dim result as String * 8
dim bit8,bit7,bit6,bit5,bit4,bit3,bit2,bit1 as integer

Config PortB.0 = Input ' Decimal or Hex Mode


'8 Bit Data Input
Config Portc.5 = Input
Config Portc.4 = Input
Config Portc.3 = Input
Config Portc.2 = Input
Config Portc.1 = Input
Config Portc.0 = Input
Config PortB.2 = Input
Config PortB.1 = Input



Config Portd.6 = Output                                     ' for TM1637 
data
Config Portd.7 = Output                                     ' for TM1637 
clock

Tm1637_clk Alias Portd.7
Tm1637_dout Alias Portd.6
Tm1637_din Alias portd.6

Declare Sub Tm1637_disp(byval Bdispdata As Word)            'The display 
can only show numbers
Declare Sub Tm1637_wrbyte(byval Bdata As Byte)
Declare Sub Tm1637_on()
Declare Sub Tm1637_off()
Declare Sub Tm1637_start()
Declare Sub Tm1637_stop()
Declare Sub Tm1637_ack()


'======================================================================= 
=
'
'     Start main
'
'======================================================================= 
=


'Tm1637_on
'Tm1637_disp 45
'Wait 2
'Tm1637_off


Tm1637_on
z=0
Do

    result = str(pinc.5) + str(pinc.4) + str(pinc.3) + str(pinc.2) + 
str(pinc.1) + str(pinc.0) + str(pinb.2) + str(pinb.1)
    'Print result
    bit8 = pinc.5 * 128
    bit7 = pinc.4 * 64
    bit6 = Pinc.3 * 32
    bit5 = pinc.2 * 16
    bit4 = pinc.1 * 8
    bit3 = pinc.0 * 4
    bit2 = pinb.2 * 2
    bit1 = pinb.1 * 1

    z = bit8
    z = z + bit7
    z = z + bit6
    z = z + bit5
    z = z + bit4
    z = z + bit3
    z = z + bit2
    z = z + bit1





    'if pinb.1 = 1 then
    '  pORTb.0 = 1
    'else
    '  pORTb.0 = 0
    'end if

    Tm1637_disp z


    'Print "Hallo - Ich zaehle: "; z
    'incr z
    'toggle   PortB.0
    'wait 1

Loop





'======================================================================= 
==
'
'     Subroutines
'
'======================================================================= 
=

Sub Tm1637_ack()
   Reset Tm1637_clk
   Waitus 5
   Reset Tm1637_dout
   Bitwait Tm1637_din , Reset
   Set Tm1637_clk
   Waitus 2
   Reset Tm1637_clk
   Set Tm1637_dout
End Sub



Sub Tm1637_off()
   Tm1637_start
   Tm1637_wrbyte &H80                                       'Turn 
display off
   Tm1637_ack
   Tm1637_stop
End Sub



Sub Tm1637_on()
   Tm1637_start
   Tm1637_wrbyte &H8A                                       'Turn 
display on and set PWM for brightness to 25%
   Tm1637_ack
   Tm1637_stop
End Sub



Sub Tm1637_start()
   Set Tm1637_clk
   Set Tm1637_dout
   Waitus 2
   Reset Tm1637_dout
End Sub


Sub Tm1637_stop()
   Reset Tm1637_clk
   Waitus 2
   Reset Tm1637_dout
   Waitus 2
   Set Tm1637_clk
   Waitus 2
   Set Tm1637_dout
End Sub



Sub Tm1637_disp(byval Bdispdata As Word)
   Local Bcounter As Byte
   Local Strdisp As String * 5

   Strdisp = Str(bdispdata)
   Strdisp = Format(strdisp , "     ")

   Tm1637_start
   Tm1637_wrbyte &H40 
'autoincrement adress mode
   Tm1637_ack
   Tm1637_stop
   Tm1637_start
   Tm1637_wrbyte &HC0 
'startaddress first digit (HexC0) = MSB display
   Tm1637_ack

   For Bcounter = 2 To 5
      Select Case Asc(strdisp , Bcounter)
         Case "0" : Tm1637_wrbyte &B00111111
         Case "1" : Tm1637_wrbyte &B00000110
         Case "2" : Tm1637_wrbyte &B01011011
         Case "3" : Tm1637_wrbyte &B01001111
         Case "4" : Tm1637_wrbyte &B01100110
         Case "5" : Tm1637_wrbyte &B01101101
         Case "6" : Tm1637_wrbyte &B01111101
         Case "7" : Tm1637_wrbyte &B00000111
         Case "8" : Tm1637_wrbyte &B01111111
         Case "9" : Tm1637_wrbyte &B01101111
         Case Else : Tm1637_wrbyte &B00000000
      End Select
      Tm1637_ack
   Next
   Tm1637_stop
End Sub



Sub Tm1637_wrbyte(byval Bdata As Byte)
   Local Bbitcounter As Byte

   For Bbitcounter = 0 To 7                                 'LSB first
      Reset Tm1637_clk
      Tm1637_dout = Bdata.bbitcounter
      Waitus 3
      Set Tm1637_clk
      Waitus 3
   Next
End Sub

von S. Landolt (Gast)


Lesenswert?

Ich würde als erstes die Fuse-Bytes vergleichen.
Da aber sonst alles funktioniert, ist das eher ein Schuss ins Blaue, 
zugegeben.

> Serial out geht auch wunderbar
Ich hätte es ja als "wunderlich" bezeichnet - was ist das für ein Gerät 
mit 9800 Bd?

von Asdf A. (vampire05)


Lesenswert?

Erstmal vielen Dank für die flotte Antwort S.Landolt.

Das mit den 9800 Baud ist mir gar nicht aufgefallen, da alles copp/paste 
code ist :-) Funktioniert aber trotzdem!

Kann man die Fuse Bits direkt in Bascom auslesen?

von S. Landolt (Gast)


Lesenswert?

> mir gar nicht aufgefallen
Aha - na okay, 2 % Fehler werden verkraftet.

> Kann man die Fuse Bits direkt in Bascom auslesen?
Tut mir leid, kann ich nicht sagen (arbeite nicht mit Bascom).

von Asdf A. (vampire05)


Lesenswert?

Okay Trotzdem vielen lieben Dank für die Hilfe. Ich schaue gerade nach 
wie ich mit atmel studio die fuse bits auslesen kan...

von Rüdiger (Gast)


Lesenswert?

Asdf A. schrieb:
> Kann man die Fuse Bits direkt in Bascom auslesen?

Natürlich!

von Asdf A. (vampire05)


Angehängte Dateien:

Lesenswert?

Ich habe es gefunden in Bascom. Geht ziemlich bequem. Ich habe die Fuses 
beider Controller ausgelesen, sieht bis auf die Kalibrierung ziemlich 
ähnlich aus (Siehe Anhang). Links ist der Atmega8-8PU und Rechts der 
Atmega8-16PU.


Was könnte es noch sein ...?

: Bearbeitet durch User
von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Hm, mit dem internen RC-Oszi und RS-232 hatte ich immer Probleme.

Hast Du mal probiert, das Display langsamer anzusteuern? Vielleicht 
kratzt Du da gerade so an den Limits und reißt sie mit dem -16.

Hast Du einen zweiten -16 probiert? Möglicherweise ist der eine defekt. 
Stimmen die Pegel an den Signalleitungen zum Display? Hat das Display 
Strom?

von H. H. (Gast)


Lesenswert?

War da nicht was mit Fälschungen, gerade beim ATMEGA8?

von Asdf (Gast)


Lesenswert?

Das Timing habe ich verlangsamt. Bringt leider auch kein Erfolg. Das ist 
leider mein einziger 16er. Dann werde ich das ganze mal als Fälschung 
verbuchen. Habe gestern Abend bei eBay noch weitere atmega8-8 
geschossen. Müssten bis Übermorgen kommen! Dann probiere ich es mal mit 
denen aus! Auf jeden Fall Danke euch allen für eure Unterstützung!

Beitrag #6854186 wurde vom Autor gelöscht.
von Oliver S. (oliverso)


Lesenswert?

Asdf schrieb:
> Dann werde ich das ganze mal als Fälschung
> verbuchen.

Das ist natürlich die naheliegendste Erklärung. Direkt danach käme noch 
ein Compilerfehler.

Weit abgeschlagen sind Programmierfehler, und Fehler im Hardwareaufbau. 
Sowas ist gerade bei Anfängern ja äusserst unwahrscheinlich.

Oliver

von Rüdiger (Gast)


Lesenswert?

Gute, belastungsfähige Stromversorgung mit welcher Spannung?

von Peter D. (peda)


Lesenswert?

Asdf A. schrieb:
> klappt hervorragend mit dem Atmega8-8PU.

Den gibt es nicht.
Es gibt nur den Atmega8L-8PU.
Und den Nachfolger Atmega8A-PU.

von Peter D. (peda)


Lesenswert?

Asdf A. schrieb:
> Sobald ich den Code auf den
> Atmega8-16PU flashe geht es nicht mehr.

Und was ist die Fehlerbeschreibung?

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

Rüdiger schrieb:
> Gute, belastungsfähige Stromversorgung mit welcher Spannung?

Gerade die Spannung wäre mal einer Messung würdig weil dort der größte 
Unterschied liegt:
- ATmega8L-8PU  2.7 - 5.5V, 8MHz
- ATmega8-16PU  4.5 - 5.5V, 16MHz

von Willy L. (sabberlotte)


Lesenswert?

Irgend W. schrieb:
> Gerade die Spannung wäre mal einer Messung würdig weil dort der größte
> Unterschied liegt:
> - ATmega8L-8PU  2.7 - 5.5V, 8MHz
> - ATmega8-16PU  4.5 - 5.5V, 16MHz



Asdf A. schrieb:
> $crystal = 1000000     'Resonatorfrequenz

?????

von Asdf A. (vampire05)


Lesenswert?

Ich messe eine Spannung von 4,7 Volt am Controller. Spannungsversorgung 
kommt über Computer USB Port.

Fehlerbild ist: Keine Leuchtenden Segmente auf der Anzeige :-)
Sie haben recht es handelt sich um den Atmega8L-8PU.

@Oliver S.: Ein Hinweis für die Fälschung könnte natürlich auch das Logo 
von Atmel auf dem Chip sein. Es ist nicht das richtige Logo (andere 
Schriftart) und auch nur sehr blass eingebrannt. Aber Sie dürfen sich 
jetzt heute morgen wie ein richtiger "Profi" fühlen, der einem Anfänger 
mit hilfreichen Hinweisen geholfen hat. Hut ab.

von Asdf A. (vampire05)


Lesenswert?

Irgend W. schrieb:
> Gerade die Spannung wäre mal einer Messung würdig weil dort der größte
> Unterschied liegt:
> - ATmega8L-8PU  2.7 - 5.5V, 8MHz
> - ATmega8-16PU  4.5 - 5.5V, 16MHz



Asdf A. schrieb:
> $crystal = 1000000     'Resonatorfrequenz

?????


Ist das nicht richtig????
interner 1 MHz RC Oszillator?

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Asdf A. schrieb:
> Fehlerbild ist: Keine Leuchtenden Segmente auf der Anzeige :-)

Das klingt nach einem gern gemachten Fehler beim SPI:
Der Pin /SS ist nicht als Ausgang definiert und floatet lustig vor sich 
hin. Oder wird erst nach dem SPI initialisiert.
Daher kann es bei einem Exemplar klappen, bei einem anderen nicht.

von EAF (Gast)


Lesenswert?

Asdf A. schrieb:
> Ist das nicht richtig????
> interner 1 MHz RC Oszillator?

Wenn man weiß, dass der interne Oszillator kein Resonator ist, fällt 
einem schon eine Diskrepanz auf.
Nicht jedem, aber so manch einem.

von EAF (Gast)


Lesenswert?

Peter D. schrieb:
> Der Pin /SS ist nicht als Ausgang definiert und floatet lustig vor sich
> hin.
Ja, der Fehler wird gerne gemacht und taucht dann auch gerne mit 
Verspätung auf.
Verzweifelte Seelen....

Aber hier, da sehe ich nix von SPI.
Daraus folgt:
Ohne SPI: Nix der Fehler.

von Asdf (Gast)


Lesenswert?

Ahso, die Kommentare sind auch copy paste Überbleibsel :-) deswegen 
resonatorfrequenz ...

Der Segment IC hat kein echtes SPI.

Die Tatsache, dass es mit einem Controller läuft aber mit einem anderen 
(fast gleichen) nicht, ist sehr merkwürdig. Ich hänge da mal einen 
Logicanalyzer/Speicherscope dran und schaue mal genauer was da so 
abläuft...

von Äxl (Gast)


Lesenswert?

Interrupt-Tabelle?
Am Ende sind es die CASE, die den Atmega16 mittels rjmp intern nicht so 
weit springen lassen, bzw. die oberen 8K nicht adressieren kann, weils 
im Code blöd liegt.
Sowas in der Art.
Fake ist es mit Sicherheit nicht.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Asdf schrieb:
> Dann werde ich das ganze mal als Fälschung verbuchen.
Das ghet aber arg schnell...
Hast du auch mal ein simples Blinkprogramm getestet und kontrolliert, ob 
die Blinkerei zeitlich passt?
Oder hast du nur den ganz großen Koffer mit Allem auf einmal getestet?
Denn schon, dass die serielle Schnitte läuft ist viel mehr Aufwand, als 
nur einen Portpin zu schalten.

Asdf schrieb:
> Ahso, die Kommentare sind auch copy paste Überbleibsel
Lieber gar keine Kommentare als Falsche.

Asdf schrieb:
> Die Tatsache, dass es mit einem Controller läuft aber mit einem anderen
> (fast gleichen) nicht, ist sehr merkwürdig.
Vielleicht hätte es gereicht, einfach einen anderen, sogar "gleichen" 
Controller da reinzustecken...

von S. Landolt (Gast)


Lesenswert?

> den Atmega16 mittels rjmp
?-?
Es geht um den ATmega8.

von Oliver S. (oliverso)


Lesenswert?

Asdf A. schrieb:
> Sobald ich den Code auf den
> Atmega8-16PU flashe geht es nicht mehr.
> …
> Hier der Code:
> $regfile = "m8def.dat"
> $framesize = 32
> $swstack = 32
> $hwstack = 64

Und das flashst du genau so auf den Mega16?

Oliver

von Asdf (Gast)


Lesenswert?

@Axl: ich weiß nicht ganz ob ich verstanden habe was du meinst. Es geht 
also um diesen Codeblock:

Select Case Asc(strdisp , Bcounter)
         Case "0" : Tm1637_wrbyte &B00111111
         Case "1" : Tm1637_wrbyte &B00000110
         Case "2" : Tm1637_wrbyte &B01011011
         Case "3" : Tm1637_wrbyte &B01001111
         Case "4" : Tm1637_wrbyte &B01100110
         Case "5" : Tm1637_wrbyte &B01101101
         Case "6" : Tm1637_wrbyte &B01111101
         Case "7" : Tm1637_wrbyte &B00000111
         Case "8" : Tm1637_wrbyte &B01111111
         Case "9" : Tm1637_wrbyte &B01101111
         Case Else : Tm1637_wrbyte &B00000000
End Select

warum sollte hier ein Problem mit den Sprüngen vorliegen??? Ich habe 
leider keinen Debugger (soweit ich weiss braucht man einen für atmel 
controller).
Warum sollte das selbe compilat auf dem atmega8l-8pu laufen aber nicht 
auf dem 16pu. beide haben doch den selben speicher????

Kann man sich in bascom den disassamblierten code anzeigen lassen?


>Das ghet aber arg schnell...
>Hast du auch mal ein simples Blinkprogramm getestet und kontrolliert, ob
>die Blinkerei zeitlich passt?
>Oder hast du nur den ganz großen Koffer mit Allem auf einmal getestet?
>Denn schon, dass die serielle Schnitte läuft ist viel mehr Aufwand, als
>nur einen Portpin zu schalten.

ich habe leider noch kein kleines blinkprogramm getestet. um so 
merkwürdiger ist es, dass die serielle schnittstelle läuft der rest aber 
nicht!


>Vielleicht hätte es gereicht, einfach einen anderen, sogar "gleichen"
>Controller da reinzustecken...
 das ist die naheliegenste entscheidung. Ich brauch für mein Projekt 
(Arithmetik- und Logikeinheit) drei binär-zu-dezimal-decoder. Hatte aber 
nur diese drei atmega8 controller rumliegen. deswegen habe ich gestern 
auch einfach 10 neue atmega8 bestellt :-)

von Asdf (Gast)


Lesenswert?

Oliver S.: Dafür das du so gut austeilst, hast du echt schwierigkeiten 
mit dem lesen: Es geht um den Atmega8! nicht den Atmega16.

$regfile = "m8def.dat" passt also für beide Atmega8 Varianten!

von H. H. (Gast)


Lesenswert?

Ein Beispiel für gefälschte AVR:

https://youtu.be/o0rEzcKYzGw

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Sowas wie Interrupts würde ich ausschließen. Das ist ein 
Compilerprogramm, damit ist es die Aufgabe des Compilers, daß der sowas 
crashfrei hinbekommt. Bei Assembler sähe das anders aus.

von S. Landolt (Gast)


Lesenswert?

> Sowas wie Interrupts ...
Das war ohnehin nur der Irrtum von zwei 'Überfliegern'.

von Peter D. (peda)


Lesenswert?

Ich würde erstmal testen, ob der MC defekt oder gefälscht ist.
Dazu ein Lauflicht programmieren, was nacheinander alle Portpins 
einschaltet und das mit LEDs (+Vorwiderstand) kontrollieren.
Wenn alle Pins als Ausgang funktionieren, sollte auch das 
Bit-Banging-SPI gehen.

Debugging heißt nicht, ratlos vor dem gesamten Klotz zu sitzen, sondern 
das Programm in einzelne Schritte zu zerlegen, und die dann jeder für 
sich zu überprüfen.
Man kann z.B. das SPI mit 3 LEDs und 1s-Delays oder ner entprellten 
Taste einzeln durchsteppen.

von Asdf (Gast)


Lesenswert?

Das ist ein guter Ansatz Peter. So werde ich es machen!

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.