Forum: Mikrocontroller und Digitale Elektronik Atmega168 + Bascom - unvorhersehbares Verhalten


von Christian W. (Firma: www.360customs.de) (doctormord)


Lesenswert?

Hallo zusammen,

ich habe gerade ein Programm von einem Atmega8 auf einen Atmega168 
gebracht und ein paar Probleme. Das Programm funktioniert in 11 von mir 
getesteten Atmega8 in vorgegebener Schaltung zuverlässig.

Angeschlossen sind ein 4x20 LCD im 4bit-Mode, ein Navilock-504TTL 
GPS-Empfänger sowie ein I²C-Modul von Maxim. Bascom ist 1.11.9.8.

Das regfile wurde passend auf "m168def.dat" geändert, alle vom Compiler 
erzeugten Files gelöscht und neu compiliert.

Auf dem 168er ergibt sich dann folgendes Bild.

Nach dem Start hängt sich der Controller gerne mal weg und kann das 
Display nicht initialisieren. Manchmal hängt sich sogar der Watchdog mit 
weg. Nach einem Reset läuft das Programm an, das Display zeigt aber 
nichts mehr an oder nur wirre Zeichen.

Beim Start des Programms läuft ein Counter in einer einfachen 
INCR-Schleife, welche knapp 2 Sekunden läuft und per Watchdog überwacht 
wird. In 50% der Fälle läuft diese Schleife allerdings mit nur 10% der 
Geschwindigkeit, der WD macht dann einen Reset.
1
Do
2
Start Watchdog
3
Incr Weiter
4
Waitms 100
5
Debounce Pinb.1 , 0 , Settings , Sub
6
Locate 1 , 1
7
Lcd Weiter ; "  "
8
Stop Watchdog
9
Loop Until Weiter = 20

Die Fuses sind auf internen Quarz gesetzt, ohne Prescaler. Ich habe mir 
den Takt an B.0 ausgeben lassen, auch wenn der Timer zu langsam läuft, 
liegt der Takt bei 8Mhz. Brown-Out ist mit 4.3V aktiviert.

Ein weiteres Problem ist das Senden von Strings per Hardware-UART. Ich 
sende 5x einen Befehl in einer Schleife und lasse mir den "Count" 
ausgeben. Manchmal dauert das nur 1 Sekunde, manchmal 10 Sekunden.

Compiliere ich das Programm wieder für einen Atmega8 und nutze den, 
funktioniert alles ohne Probleme.

Programm-Header:
1
$regfile = "m168def.dat"
2
$crystal = 8000000
3
4
$hwstack = 64
5
$swstack = 20
6
$framesize = 64
7
8
Config Lcd = 20 * 4 , Chipset = Ks077
9
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
10
Config Lcdbus = 4
11
12
Deflcdchar 0 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 32        ' replace ? with number (0-7)
13
Deflcdchar 1 , 10 , 4 , 10 , 32 , 22 , 32 , 20 , 14         ' FIX
14
Deflcdchar 2 , 32 , 32 , 32 , 32 , 16 , 32 , 31 , 32        ' low
15
Deflcdchar 3 , 32 , 32 , 32 , 8 , 24 , 32 , 31 , 32         ' over low
16
Deflcdchar 4 , 32 , 32 , 4 , 12 , 28 , 32 , 31 , 32         ' medium
17
Deflcdchar 5 , 32 , 2 , 6 , 14 , 30 , 32 , 31 , 32          ' over medium
18
Deflcdchar 6 , 1 , 3 , 7 , 15 , 31 , 32 , 31 , 32           ' high
19
Deflcdchar 7 , 25 , 17 , 5 , 5 , 21 , 32 , 31 , 32          ' Dead Reconing
20
21
22
Cls
23
Cursor Off Noblink
24
25
Config Debounce = 20                                        ' Button entprellen
26
Config Watchdog = 2048
27
28
Config Scl = Portc.5                                        ' we need to provide the SCL pin name
29
Config Sda = Portc.4                                        ' we need to provide the SDA pin name
30
Const Pcf_write = &H70                                      ' Slaveadresse
31
Const Pcf_read = &H71
32
33
Config Timer0 = Timer , Prescale = 64                       ' Timer für PWM-Interrupt
34
35
Config Portb.0 = Output                                     ' Output PWM
36
Config Portc.3 = Output
37
38
Portb.1 = 1                                                 ' Set/Reset Button für Counter
39
Portb.2 = 1                                                 ' Set/Reset Button Spare
40
41
$baud = 9600
42
Waitms 100
43
44
'now set register Clkpr to 8 Mhz
45
'RTFM: First, set first *only* Clock Prescaler Change Enable...
46
Clkpr = &H80                                                'Clkpce
47
LDI     R24,&B0000                                          'Clkps1&Clkps0
48
STS     Clkpr,R24                                           '...then (max. 4 Clocks!) prescaler = 8, Inter RC 8Mhz / 8 = 1Mhz
49
50
51
'Config Lcd = 20 * 4
52
'Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
53
54
55
I2cinit
56
57
On Timer0 Timer0_isr                                        ' Bei Timerüberlauf Interrupt auslösen und Timer0_isr ausführen
58
On Urxc Onrxd                                               'Interrupt-Routine setzen
59
60
Enable Timer0
61
Enable Urxc
62
Enable Interrupts
63
64
Baud = 9600

Hat jemand eine Idee, woran das liegen könnte?

Vielen Dank und liebe Grüße

Christian

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.