Forum: Mikrocontroller und Digitale Elektronik Zu bloed fuer den Atmega88?


von André K. (andre-)


Lesenswert?

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

von André K. (andre-)


Lesenswert?

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

von A.K. (Gast)


Lesenswert?

Passt der Prescaler zum Takt?

von André K. (andre-)


Lesenswert?

Nein, aber da hab ich auch schon alles durch. 64 Sollte ja ganz gut
passen aber damit klappts leider auch ned.

mfG

von Kai (Gast)


Lesenswert?

liegt am dat-file/compiler. hab mit m168 ähnliche probleme.mit m8
dagegen alles bestens....

von André K. (andre-)


Lesenswert?

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

von A.K. (Gast)


Lesenswert?

Dass der Mega88 eine 1.1V-Referenz an Stelle einer 2,56V-Referenz hat,
hast Du sicher berücksichtigt.

von André K. (andre-)


Lesenswert?

Japp, die Referenz ist ja auch aus. Haengen 5V an Vref :(

MfG

von A.K. (Gast)


Lesenswert?

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

von André K. (andre-)


Lesenswert?

Hm, dat stimmt allerdings. Dieser Teil kam aus dem *.hex, das Bascom
erzeugt hatte. Werd das mal eben testen.

Vielen Dank und mfG,
André

von André K. (andre-)


Lesenswert?

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

von A.K. (Gast)


Lesenswert?

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.

von André K. (andre-)


Lesenswert?

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

von André K. (andre-)


Lesenswert?

Naa, ist natuerlich Mist WDE gleich beim Start zu setzen *g. Der
Compiler braucht dringend ein Update...

Leider aendert sich dadurch auch noch nix, ich vermute es liegt am
WDRF-Bit.

MfG

von A.K. (Gast)


Lesenswert?

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.

von André K. (andre-)


Lesenswert?

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é

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.