Bascom: atmega8-16pu verhält sich anders als atmega8-8pu

#6853810
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
Gast #6853823
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?
(Firma: Funkenflug Industries) #6853954
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?
Gast #6854173
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 von einem Moderator gelöscht.
#6854295
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.
#6854299
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?
Gast #6854519
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...
Gast #6854530
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.
Moderator (Firma: Titel) Persönliche Seite #6854544
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...
Gast #6854624
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 :-)
#6855198
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.

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