Zu bloed fuer den Atmega88?

OP #213203
Moin,
ich versuche gerade krampfhaft, dem Mega88 sinnvolle ADC-Werte zu
entlocken. Leider erfolglos, denn:
1. Sind die Werte beim nachrechnen einfach nur falsch
2. Schwanken einige unnatuerlicherweise nichtmal um ein Bit (wie beim
Trabbi. Wenns nicht klappert, isser kaputt...).
1
$regfile = "m88def.dat"
2
$crystal = 18432000
3
$baud = 115200
4

5
Config Adc = Single , Prescaler = 8 , Reference = Off
6
Start Adc
7

8
Config Portc = Input : Config Portb = Input : Config Portd = Input
9
Portb = 0 : Portc = 0 : Portd = 0
10

11

12
Dim Uc As Integer
13
Dim Channel As Byte
14

15

16
Print "start"
17

18

19
Do
20
   For Channel = 0 To 7
21
      lds r25, {channel}
22
      sts admux, r25
23

24
      ldi R25 , &B11000000    'start conversion (adcsr.adsc=1)
25
      STS     adcsr,R25
26

27
      !x1:
28
      LDS     R25,adcsr
29
      SBRC    R25,adsc
30
      jmp x1               'wait for conversation's end
31
(adcsr.adsc=0)
32

33
      LDS     R22,adcl
34
      Lds R23 , adch
35

36
      sts {uc}, r22
37
      sts {uc+1}, r23
38

39
      Print Uc ; ":";
40
   Next
41

42
   Print
43
   Print
44
   Waitms 600
45
Loop
46

47
End
OP
Ahrg, vergessen weiterzuschreiben *g.

Den asm-Teil hab ich aus Verzweifelung eingefuegt, da
uc=getadc(channel) auch nicht wirklich funktioniert.

Dazu ist vielleicht noch zu sagen, dass die gleiche Platine mit einem
Atmega8 einwandfrei funktionierte, HW-Fehler kann man also
ausschliessen.

Ist der Mega88 wirklich noch so unausgereift, dass man ihn nicht
verwenden kann? Auch der Watchdog fuehrt bei mir zu einem Absturz, aus
dem man den µC selbst mit normalem HW-Reset nicht mehr befreien kann,
sondern erst Klimmzuege machen muss.

MfG
OP
Ja aber eigentlich sollte es doch funktionieren. Ich hab das *.hex, das
Bascom erzeugt in AVR-Studio geladen und keine Fehler gefunden. STS
wurde ueberall richtig benutzt und die Adresse der Register stimmen
auch alle. Komische Sache.

MfG
Gast
Was mit Bascom los ist  weiss ich nicht, den kenne ich nicht. Aber mit
diesem Assembler-Code setzt Du den Prescaler auf /2, was bei dem Takt
nicht funktionieren kann:
      ldi R25 , &B11000000    'start conversion (adcsr.adsc=1)
      STS     adcsr,R25
OP
Super, hab ich gar nicht drauf geachtet. Nun funktioniert das schonmal.
Bleibt noch das Problem mit dem Watchdog, der macht was er will.

Beim Atmega8 funktionierte folgendes:

reset:
start watchdog
do:loop

Fuehrte nach ca.16ms zwangslaeufig zum Reset. Beim Atmega88 fuehrt es
dazu, dass der Controller eiskalt stehenbleibt und nicht mehr auf
Reset-Signale reagiert. Vielmehr muss man ihm erst einige Sekunden den
Saft abdrehen und kann ihn anschliessend durch wildes
"Reset-Druecken" wieder zum Leben erwecken. Hat dazu vielleicht
jemand ne Idee? Werde mich damit auch gleich nochmal befassen und evtl.
das Stueckchen asm posten.

Danke nochmal an meinen Fast-Namensvetter *g
Gast
Dafür wär's halt nützlich, zu wissen, was genau der Bascom draus macht.
Immerhin hat der Mega88 einen Watchdog-Interrupt, der Mega8 nicht.

Aber dass ihn dies dazu bringt, auf Reset nicht zu reagieren, das ist
schon etwas bizarr.
OP
1
$regfile = "m88def.dat"
2
$crystal = 18432000
3
$baud = 115200
4

5
LDI     R24,&B00011000           'set wdce  + wde
6
STS     wdtcsr,R24
7
LDI     R24,&B00010000           'wdtp = 16ms
8
STS     wdtcsr,R24
9

10
Wait 1
11
Print "start"
12

13
LDS     R24,wdtcsr
14
ORI     R24,8                    'set WDE
15
STS wdtcsr , R24
16

17

18
Do
19
Print "X"
20
Waitms 1
21
Loop
22

23

24
End

Also er scheint, wenn man ihn denn einmal ans laufen gebracht hat,
einmal zu "resetten". Danach kommt gar nix mehr, wobei ich vermute,
dass er da irgendwo schon am Programmstart haengenbleibt und ihn
irgendein Bit immer wieder am Weiterlaufen hindert. Das Bit laesst sich
wohl nur mit recht unkonventionellen Methoden wieder richten.

Werd dann mal weiter Datenblatt waelzen.
MfG
Gast
In der üblichen Sequenz zum Einschalten vom Watchdog-Timer wird der
Timer unmittelbar davor vorher zurückgesetzt:

  wdr
  cli
  ldi  r24, (1<<WDCE) | (1<<WDE)
  out  WDTCSR, r24
  ; -- Got four cycles to set the new values from here -
  ; Set new prescaler(time-out) value = 1024K cycles (~8.0 s)
  ldi  r24, 1<<WDE | 1<<WDP3 | 0<<WDP2 | 0<<WDP1 | 1<<WDP0
  out  WDTCSR, r24
      sei

Ausserdem steht im Datasheet, dass man in der Initialisierung WDRF
zurücksetzen sollte.
OP
1
$regfile = "m88def.dat"
2
$crystal = 18432000
3
$baud = 115200
4

5
cbi mcusr, 3
6

7
Wait 1
8
Print "start"
9

10
cli
11
wdr
12
LDI     R24,&B00011000
13
STS     wdtcsr,R24
14
ldi r24, &B00001000
15
sts  WDTCSR, r24
16

17

18
!xs:
19
jmp xs
20

21
End

Alles wie gehabt :(

Hab leider von C oder anderen Sprachen nicht unbedingt die grosse
Ahnung. Koennte mal jemand versuchen, den gleichen Code in C zu
schreiben und das *.hex oder *.bin zur Verfuegung stellen? Wenns geht
mit gleicher Baudrate und gleicher Quarzfrequenz.

Es schlug uebrigens auch ein Simulieren im AVR-Studio fehl, wobei das
aber in Schleifen hing, wo es gar nicht haette haengen duerfen.

Danke und mfG,
André

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.