PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Nur ca. 30 Programmierungen möglich bei ATmega8



Mosi
11.06.2007, 16:43
Hallo,

merkwürdige Dinge passieren mir:
nach ca. 30-40 Programmierungen fällt nach und nach die LCD-Anzeige aus, es werden keine Zeichen mehr angezeigt. Anfangs hilft ein Reset, später dann einige Resets hintereinander, noch später muss ich längere Zeit die Betriebsspannung abschalten, irgendwann geht gar nichts mehr.
Erst vermutete ich einen defekten Controller, nach wechseln war zunächst alles ok, dann ging es nach etwa 30 Zyklen wieder los...
Zwischendurch ein anderes x-beliebiges Programm mal schnell aufgespielt, und alles geht wieder, für genau ein Mal!
Ist bei 30 Programmierungen das Ende erreicht?
Ich verwende:
Board RN-Mega8-plus, RN-isp-Controller, Bascom

Gruß, Rene

Spion
11.06.2007, 16:47
Hallo

Das tönt als haste nen Bock in deinem Programm.

Poste es doch mal.

mfg Luca

Mosi
11.06.2007, 17:08
Die Sache ist programmunabhängig,
ich versuch mal mein derzeitiges Programm-Fragment hier reinzustellen,
das Programm an sich läuft (soweit es geschrieben ist) sehe ich an den Wirkungen...nur die LCD-Anzeige bleibt aus

PS.wie macht ihr das nur, dass der Code im eigenem Fenster lesbar ist?

Jon
11.06.2007, 17:16
PS.wie macht ihr das nur, dass der Code im eigenem Fenster lesbar ist?
Mit [_code][_/code].
Natürlich ohne die "_" Der Code kommt dann dazwischen.

Bei deinem Problem kann ich dir aber nicht weiterhelfen. Hab noch nie von so einem Fall gehört

jon

adrisch
11.06.2007, 17:18
Den Text in
-Klammern schreiben

z.B.:


'---------------------------------------------------------
' Aquariumsteuerung mit dcf77 Uhr von mosi
' mit DCF77 library from Josef Vögel
'---------------------------------------------------------
$regfile = "M8def.dat"
$crystal = 7372000

'------------------------------------------------------------
'benutzte pins:
'für LCD: portd, pin 2,3,4,5,6
' portc, pin 2,3
'für DCF Uhr: b,0
'ausgänge: b.1=Licht, b.2=Heizung, b.3=pwm für licht, b.4=Co2, b.5=mondlicht
'analogeingänge: c.0=ADC0=Leitwert, c.1=ADC1=pH-Wert
'1wire eingang=c.6




'Konfigurationen der Hardware
Config Timer2 = Pwm , Compare Pwm = Clear Up , Prescale = 1
Config Dcf77 = Pinb.0 , Timer = 1 , Inverted = 1 , Check = 0 , Gosub = Sectic
Config Date = Dmy , Separator = .

'Konfiguration LCD
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portc.3 , Rs = Portc.2
Config Lcd = 20 * 4a , Chipset = Ks077
Config Lcdbus = 4
Config Pind.6 = Output
Portd.6 = 0

Config Adc = Single , Prescaler = Auto , Reference = Internal

'Konfigurationen pins

Config Pinb.1 = Output 'Licht an-aus
Config Pinb.2 = Output 'Heizung an-aus
Config Pinb.3 = Output 'PWM Ausgang Timer2
Config Pinb.4 = Output 'Co2-Ventil an-aus
Config Pinb.5 = Output 'Mondlicht an aus

Taglicht Alias Portb.1
Heizung Alias Portb.2
Co2 Alias Portb.4
Mondlicht Alias Portb.5

Dim Soll_dim As Byte 'sollwert der dimmung, abhängig von Tageszeit
Dim Ist_dim As Byte '255 Werte für PWM-Lichtdimmung
Dim Licht_lcd As Integer '%Anzeige der Licht-Dimmung
Dim Zeit As Byte 'Zaehlvariable in sekunden für Dimmer
Dim Pfeil As Byte '3für runter, 4 für waagerecht, 2 für hoch
Dim Roh_phwert As Integer
Dim Min_phwert As Single
Dim Lcd_phwert As Single
Dim Roh_leitwert As Integer
Dim Lcd_leitwert As Integer

Const On = 1
Const Off = 0



Enable Interrupts

'Sonderzeichen generieren

Deflcdchar 0 , 2 , 5 , 2 , 32 , 32 , 32 , 32 , 32 ' Gradzeichen
Deflcdchar 1 , 32 , 32 , 17 , 17 , 17 , 30 , 16 , 32 ' mikrozeichen
Deflcdchar 2 , 15 , 3 , 5 , 9 , 16 , 32 , 32 , 32 ' pfeil nach oben
Deflcdchar 3 , 32 , 32 , 16 , 9 , 5 , 3 , 15 , 32 ' pfeil nach unten
Deflcdchar 4 , 8 , 4 , 2 , 31 , 2 , 4 , 8 , 32 ' pfeil waagerecht

Cls
Cursor Off


'initialisierungen
_hour = 20 'bei reset auf 20Uhr stellen
Ist_dim = 100 'Dimmer auf etwa 50%
Zeit = 0 'Sekundenzaehler auf null
Pfeil = 4 'waagerechter pfeil
Taglicht = On 'bei reset wird licht angeschaltet
Mondlicht = Off
Co2 = Off
Heizung = Off
Min_phwert = 6.5

Start Adc




Do


Locate 1 , 1
Lcd Time$ ; " " ; Date$

Select Case _hour

Case 8 To 12 : Soll_dim = 255 '100%zwischen 8 und 12Uhr
Case 13 To 15 : Soll_dim = 102 '40% zwischen 13 und 16uhr
Case 16 To 22 : Soll_dim = 255 '100% zwischen 17 und 22Uhr
Case Else : Soll_dim = 0 'sonst licht aus

End Select

Gosub Phwert
Gosub Temperatur
Gosub Leitwert


Locate 2 , 1
Lcd "temp= " ; Chr(0) ; "C " ; "Lw=" ; Roh_leitwert ; Chr(1) ; "S "


Locate 3 , 1
Lcd "L=" ; Licht_lcd ; "%" ; Chr(pfeil) ;


Locate 4 , 1
Lcd "phWert=" ; Fusing(lcd_phwert , "#.##") ; " co2"


Loop
'-------------------------------------------------------------------------------
'***************Label Temperaturerfassung ************************************
'-------------------------------------------------------------------------------
Temperatur:

Return


'-------------------------------------------------------------------------------
'***************Label ph-Werterfassung************************************* *****
'-------------------------------------------------------------------------------


Phwert:

Roh_phwert = Getadc(1)
Lcd_phwert = Roh_phwert / 170.66 '1024steps durch 6Schritte
Lcd_phwert = Lcd_phwert + 4 '0- bei pH=4

If Lcd_phwert <= Min_phwert Then
Co2 = Off
Else
Co2 = On
End If
Return






'-------------------------------------------------------------------------------
'***************Label Leitwertserfassung ***************************************
'-------------------------------------------------------------------------------



Leitwert:

Roh_leitwert = Getadc(0)


Return





'-------------------------------------------------------------------------------
'*************sekunden**************************** ******************************
'-------------------------------------------------------------------------------



Sectic:
Zeit = Zeit + 1 'Sekundenzaehler
If Zeit < 10 Then Return 'wenn noch nicht 10sekundene vergangen, dann zurück

Zeit = 0

If Ist_dim = Soll_dim Then 'wenn sollwert gleich istwert bleibt alles wie es ist,
Pfeil = 4 ' pfeil waagerecht
Return
End If

If Ist_dim < Soll_dim Then
Ist_dim = Ist_dim + 1
Pfeil = 2 'dimmung erhöhen um 1
Else 'Pfeil nach oben
Ist_dim = Ist_dim - 1 'dimmung verringern um 1
Pfeil = 3 'Pfeil nach unten
End If

If Ist_dim <> 0 Then 'Wenn Dimmung ungleich null, dann EVG anschalten
Taglicht = On
Else
Taglicht = Off
End If

Compare2 = Ist_dim
Licht_lcd = Ist_dim * 100 'Prozent der Dimmung für Anzeige
Licht_lcd = Licht_lcd / 255
Return







End

Edit: Mist, zu spät

Mosi
11.06.2007, 17:27
Danke schon mal,
also nochmal:


'---------------------------------------------------------
' Aquariumsteuerung mit dcf77 Uhr von mosi
' mit DCF77 library from Josef Vögel
'---------------------------------------------------------
$regfile = "M8def.dat"
$crystal = 7372000

'------------------------------------------------------------
'benutzte pins:
'für LCD: portd, pin 2,3,4,5,6
' portc, pin 2,3
'für DCF Uhr: b,0
'ausgänge: b.1=Licht, b.2=Heizung, b.3=pwm für licht, b.4=Co2, b.5=mondlicht
'analogeingänge: c.0=ADC0=Leitwert, c.1=ADC1=pH-Wert
'1wire eingang=c.6




'Konfigurationen der Hardware
Config Timer2 = Pwm , Compare Pwm = Clear Up , Prescale = 1
Config Dcf77 = Pinb.0 , Timer = 1 , Inverted = 1 , Check = 0 , Gosub = Sectic
Config Date = Dmy , Separator = .

'Konfiguration LCD
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portc.3 , Rs = Portc.2
Config Lcd = 20 * 4a , Chipset = Ks077
Config Lcdbus = 4
Config Pind.6 = Output
Portd.6 = 0

Config Adc = Single , Prescaler = Auto , Reference = Internal

'Konfigurationen pins

Config Pinb.1 = Output 'Licht an-aus
Config Pinb.2 = Output 'Heizung an-aus
Config Pinb.3 = Output 'PWM Ausgang Timer2
Config Pinb.4 = Output 'Co2-Ventil an-aus
Config Pinb.5 = Output 'Mondlicht an aus

Taglicht Alias Portb.1
Heizung Alias Portb.2
Co2 Alias Portb.4
Mondlicht Alias Portb.5

Dim Soll_dim As Byte 'sollwert der dimmung, abhängig von Tageszeit
Dim Ist_dim As Byte '255 Werte für PWM-Lichtdimmung
Dim Licht_lcd As Integer '%Anzeige der Licht-Dimmung
Dim Zeit As Byte 'Zaehlvariable in sekunden für Dimmer
Dim Pfeil As Byte '3für runter, 4 für waagerecht, 2 für hoch
Dim Roh_phwert As Integer
Dim Min_phwert As Single
Dim Lcd_phwert As Single
Dim Roh_leitwert As Integer
Dim Lcd_leitwert As Integer

Const On = 1
Const Off = 0



Enable Interrupts

'Sonderzeichen generieren

Deflcdchar 0 , 2 , 5 , 2 , 32 , 32 , 32 , 32 , 32 ' Gradzeichen
Deflcdchar 1 , 32 , 32 , 17 , 17 , 17 , 30 , 16 , 32 ' mikrozeichen
Deflcdchar 2 , 15 , 3 , 5 , 9 , 16 , 32 , 32 , 32 ' pfeil nach oben
Deflcdchar 3 , 32 , 32 , 16 , 9 , 5 , 3 , 15 , 32 ' pfeil nach unten
Deflcdchar 4 , 8 , 4 , 2 , 31 , 2 , 4 , 8 , 32 ' pfeil waagerecht

Cls
Cursor Off


'initialisierungen
_hour = 20 'bei reset auf 20Uhr stellen
Ist_dim = 100 'Dimmer auf etwa 50%
Zeit = 0 'Sekundenzaehler auf null
Pfeil = 4 'waagerechter pfeil
Taglicht = On 'bei reset wird licht angeschaltet
Mondlicht = Off
Co2 = Off
Heizung = Off
Min_phwert = 6.5

Start Adc




Do


Locate 1 , 1
Lcd Time$ ; " " ; Date$

Select Case _hour

Case 8 To 12 : Soll_dim = 255 '100%zwischen 8 und 12Uhr
Case 13 To 15 : Soll_dim = 102 '40% zwischen 13 und 16uhr
Case 16 To 22 : Soll_dim = 255 '100% zwischen 17 und 22Uhr
Case Else : Soll_dim = 0 'sonst licht aus

End Select

Gosub Phwert
Gosub Temperatur
Gosub Leitwert


Locate 2 , 1
Lcd "temp= " ; Chr(0) ; "C " ; "Lw=" ; Roh_leitwert ; Chr(1) ; "S "


Locate 3 , 1
Lcd "L=" ; Licht_lcd ; "%" ; Chr(pfeil) ;


Locate 4 , 1
Lcd "phWert=" ; Fusing(lcd_phwert , "#.##") ; " co2"


Loop
'-------------------------------------------------------------------------------
'***************Label Temperaturerfassung ************************************
'-------------------------------------------------------------------------------
Temperatur:

Return


'-------------------------------------------------------------------------------
'***************Label ph-Werterfassung************************************* *****
'-------------------------------------------------------------------------------


Phwert:

Roh_phwert = Getadc(1)
Lcd_phwert = Roh_phwert / 170.66 '1024steps durch 6Schritte
Lcd_phwert = Lcd_phwert + 4 '0- bei pH=4

If Lcd_phwert <= Min_phwert Then
Co2 = Off
Else
Co2 = On
End If
Return






'-------------------------------------------------------------------------------
'***************Label Leitwertserfassung ***************************************
'-------------------------------------------------------------------------------



Leitwert:

Roh_leitwert = Getadc(0)


Return





'-------------------------------------------------------------------------------
'*************sekunden**************************** ******************************
'-------------------------------------------------------------------------------



Sectic:
Zeit = Zeit + 1 'Sekundenzaehler
If Zeit < 10 Then Return 'wenn noch nicht 10sekundene vergangen, dann zurück

Zeit = 0

If Ist_dim = Soll_dim Then 'wenn sollwert gleich istwert bleibt alles wie es ist,
Pfeil = 4 ' pfeil waagerecht
Return
End If

If Ist_dim < Soll_dim Then
Ist_dim = Ist_dim + 1
Pfeil = 2 'dimmung erhöhen um 1
Else 'Pfeil nach oben
Ist_dim = Ist_dim - 1 'dimmung verringern um 1
Pfeil = 3 'Pfeil nach unten
End If

If Ist_dim <> 0 Then 'Wenn Dimmung ungleich null, dann EVG anschalten
Taglicht = On
Else
Taglicht = Off
End If

Compare2 = Ist_dim
Licht_lcd = Ist_dim * 100 'Prozent der Dimmung für Anzeige
Licht_lcd = Licht_lcd / 255
Return







End



wenn ich folgendes einmal dazwischen progge, geht alles wieder,
diese Zeilen sind absolut identisch mit denen des o.g. Programms:


$regfile = "m8def.dat"
$crystal = 7372000


Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portc.3 , Rs = Portc.2
Config Lcd = 20 * 4a , Chipset = Ks077
Config Lcdbus = 4
Config Pind.6 = Output 'RW=0
Portd.6 = 0



Cls
Locate 1 , 1
Lcd "Test LCD"

Mosi
11.06.2007, 17:29
jetzt war ich zu spät.. dafür dürfte jetzt aber alles angekommen sein...

peterfido
11.06.2007, 17:36
Was mir auf die Schnelle so aufgefallen ist, ist, dass es kein lcdinit gibt.

SIGINT
11.06.2007, 17:50
Hi Mosi,
nach 30 Zyklen ist selbstverständlich nicht schluss... das sind schon ein paar Zehnerpotenzen mehr. Vielleicht ist irgendwas mit deiner Schaltung nicht in Ordnung... irgendwie muss der AVR ja geschädigt werden. Wenn du ISP nutzt, dann ist vielleicht das Interface nicht ganz ok. Schicke mal den Schaltplan, damit man etwas mehr Infos hat.

Gruß,
SIGINT

bax
11.06.2007, 18:39
Hi,

ich hab bei mir auch öfters mal das Problem, das das Programm nicht fehlerfrei übertragen wird, in etwa so häufig wie das bei Dir klingt. Tritt ausschließlich bei mega8's auf, bei mega32 hab ich solche Zicken noch nicht festgestellt. Abhilfe schafft dann ein vorab ausgeführtes Chip Erase.
Ich hab auch ab und zu mal den Effekt, das das alte Progamm weiter läuft, speziell, wenn sich nur ein Byte geändert hat und sonst nix.

Ich nutze twinAVR und einen gekauften Parallelport-Programmer mit einem 74LSirgendwas drinne.

greetz Rajko

Mosi
11.06.2007, 19:36
Der ISP Programmer ist der von robotikhardware angebotene. Ich denke, der ist schon ok, hab noch keine Klagen darüber gehört.
Ich glaub auch nicht, dass der Programmer selbst die Ursache sein kann, müsste dann doch die Fehlerhäufigkeit unabhängig von der Anzahl der Programmierungen sein. Oder wäre es denkbar, dass der Programmer den Controller nach und nach killt?, z.B. wegen Überspannungen oder so? Kann aber eigentlich auch nicht sein, komplett neue Programme laufen ja wieder einwandfrei.
Das mit Chip Erease werd ich probieren, wird das aber nicht automatisch beim Beschreiben durchgeführt? Auch find ichs merkwürdig, dass die Schreib-Prüfung nie einen Fehler registriert.