PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Showpice und EEPROM



MelMan
10.09.2008, 07:50
Morgen zusammen,

Ich habe ein kleines Problem mit dem Befehl Showpice. Dieser soll mir konvertierte Bilder aus dem EEPROM auf einem 128x64 Display wiedergeben. Code ist wie in Bascom-Help beschrieben.

$eeprom
1:
$bgf "..."
.
.
.
$data


Do
Showpice 0,0,1
.
.
.
Loop
End

Ich verwende dazu einen ATMEGA644. Dann lade ich die Bilder in den EEPROM und übertrage dann das Programm. Am Anfang zeigt er das Bild auch an aber wenn ich dann ein anderes Bild anzeigen möchte (Menusteuerung über Touchdisplay) bekomme ich das Bild nur total verzerrt oder gar nicht erst angezeigt. Weis da einer ob man was beachten muss? Hab vorher noch nie mit dem EEPROM gearbeitet.


Mfg Mel

MelMan
11.09.2008, 11:17
weis da keiner weiter woran das liegen könnte?

Blue72
29.10.2008, 18:14
Hi MelMan,

hast Du damit immer noch Probleme ?

Gruß
Jens

MelMan
29.10.2008, 20:31
Hey Jens,

hätte nicht gedacht dass sich noch einer meldet zu dem Thema=). Also habs grad noch mal ausprobiert und ist noch immer genau das selbe Problem. Gleiches Programm, gleicher Prozessor.

Blue72
30.10.2008, 05:50
Hi,

also ich hatte so ein ähnliches Problem gestern (ATmega32).
Bei mir sieht es jetzt so aus:



$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 75
$swstack = 100

$eeprom
$eepromhex

$bgf "0.bgf"
$bgf "1.bgf"
$bgf "2.bgf"
$bgf "3.bgf"
$bgf "4.bgf"
$bgf "5.bgf"
$bgf "6.bgf"
$bgf "7.bgf"
$bgf "8.bgf"
$bgf "9.bgf"
$Data



Das ganze hab ich dann übertragen (WinAVR4) und es klappt hervorrangend. Übeträgst Du denn jedesmal die EEPROM Daten neu ? Oder hast Du das Fusebit EESAVE gesetzt ?

Ich musste EEPROMHEX hinzufügen da WinAVR immer meckerte das es kein Intel Hex Format sei.

Gruß
Jens

MelMan
30.10.2008, 18:19
Also ich hab das mal ausprobiert aber mit Bascom. Da hats leider nicht geklappt. Werde es morgen mal mit AVR-Studio ausprobieren und dir dann noch mal Bescheid sagen. Eine Frage: In meinem Code verwende ich die $bgf Funktion immer so:
Menu1:
$bgf "2.bgf"


Und dann kann ich mit Showpic Menu1 das Bild anzeigen. Ist das bei AVR- Studio anders?

Blue72
31.10.2008, 06:02
Ich habe einen USBProg welcher noch nicht von Bascom direkt unterstützt wird, deswegen muss ich über einen Umweg mit AVRStudio proggen.
Die Fuses musst Du mit dem Programm einstellen womit Du auch flasht.
Bilder aus dem EEPROM liest Du mit SHOWPICE und Bilder aus dem SRAM liest Du mit SHOWPIC ein.

MelMan
31.10.2008, 06:04
Ja so hab ich es auch probiert. Ich werd mich gleich noch mal ne Runde dran setzen und schauen ob das klappt.

MelMan
31.10.2008, 14:37
hmm hab mit WinAVR noch nie gearbeitet und grad keine Zeit mich da ein bisschen zu versuchen :(. Ich werd noch ein bisschen mit Bascom rumprobieren sollte ja auch machbar sein. Hast du noch irgendwas wichtiges in den Fusebits verstellt?

Blue72
31.10.2008, 16:20
Nein nur das "übliche".
JTAG aus (wg. PortC)
EESAVE häkchen rein (damit das EEPROM nicht gelöscht wird)

und sonst eigentlich nix ...

MelMan
05.11.2008, 19:18
HMm ne bekomme es mit Bascom nicht zum laufen. Muss die Tage mal schauen das mit AVR- Studio o.ä. zu machen denn mitlerweile sind allein 50% meines Programms nur durch .bgf Dateien belegt 8-[

Blue72
05.11.2008, 19:26
Also wenn 50% Deines Programmes mit .bgf Dateien belegt sind speicherst Du diese nicht ins EEPROM oder ? Stell doch mal Deinen Code ein, dann lässt sich der Fehler wahrscheinlich leichter finden.

Gruß
Jens

MelMan
07.11.2008, 12:40
Jep genau die Bilder werden auf dem ganz normalen Speicher hinterlegt. Programm ist wie folgt:

$regfile = "m644def.dat"
$framesize = 54
$swstack = 128
$hwstack = 64
$crystal = 8000000
$baud = 9600



Config Pinb.1 = Input
Config Portb.0 = Output
Config Porta.5 = Output
Config Porta.6 = Output
Config Portb.2 = Output
Dcf77 Alias Portb.0
Displaysp Alias Porta.5
Displaybel Alias Porta.6
Pwrled Alias Portb.2
Displaysp = 1
Pwrled = 1
Set Portb.1

Wait 2

$lib "glcdKS108.lib"

Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Portd , Ce = 2 , Ce2 = 3 , Cd = 4 , Rd = 5 , Reset = 7 , Enable = 6


Setfont Font8x8


Config Timer1 = Timer , Prescale = 256 '64 bei 10 ms
Enable Timer1
On Timer1 Cntfull
Enable Interrupts
Timer1 = 62410 '64285 bei 10ms

Config Adc = Single , Prescaler = 128 , Reference = Internal_2.56
Start Adc


Dim Stehlampes As Byte , Temp As Byte , Geraeteist As Byte , Cursorpos As Byte , Cnt As Byte , Einstellungentimesoll As Byte , Lastmenu As Byte , Weckerw As Byte , Nachtw As Byte
Dim X As Word , Y As Word , Beltimeist As Word , Beltimesoll As Word , Menutimeist As Word , Menutimesoll As Word ,
Dim Menu As Integer , Sekunden As Integer , Weckerzeit As Integer , Displaytime As Integer , Nachtein As Integer , Nachtaus As Integer , Stehlampetimeist As Integer , Leuchtkugeltimeist As Integer , Minute As Integer , Stunde As Integer , Tag As Integer , Wotag As Integer , Klmon As Integer , Kljahr As Integer , Tvtimeist As Integer , Internettimeist As Integer , Wlantimeist As Integer , Neontimeist As Integer , Lichterkettetimeist As Integer , Musikanlagetimeist As Integer , Test As Integer , Wert As Integer
Dim Nacht As Bit , Wecker1 As Bit , Wecker2 As Bit , Wcheck As Bit , Synchro As Bit , Tv As Bit , Internet As Bit , Wlan As Bit , Lastwecker As Bit , Neon As Bit , Lichterkette As Bit , Musikanlage As Bit , Leuchtkugel As Bit , P As Bit , Status As Bit , Menucheck As Bit
Dim Minute1 As String * 2 , Minute2 As String * 2 , Stunde1 As String * 2 , Stunde2 As String * 2 , Tag1 As String * 2 , Tag2 As String * 2 , Klmon1 As String * 2 , Klmon2 As String * 2 , Kljahr1 As String * 2 , Kljahr2 As String * 2 , Wochentag As String * 2

Dim Wstunden As Integer , Wstunden1 As String * 2 , Wstunden2 As String * 2 , Nminutenan1 As String * 2 , Nminutenan2 As String * 2 , Nstundenan1 As String * 2 , Nstundenan2 As String * 2
Dim Wminuten As Integer , Wminuten1 As String * 2 , Wminuten2 As String * 2 , Nminutenaus1 As String * 2 , Nminutenaus2 As String * 2 , Nstundenaus1 As String * 2 , Nstundenaus2 As String * 2
Dim W1stunden As Integer , W1minuten As Integer , Nminutenan As Integer , Nstundenan As Integer
Dim W2stunden As Integer , W2minuten As Integer , Nminutenaus As Integer , Nstundenaus As Integer


Nstundenan = 0
Nstundenaus = 0
Nminutenan = 0
Nminutenaus = 0
Weckerw = 0
Menu = 0
Beltimesoll = 150
Beltimeist = 150
Menutimesoll = 150
Menutimeist = 150
Wstunden = 0
Wminuten = 0
Synchro = 1
Wert = -1
Displaytime = 6000

.
.
.

Menu6:
Showpic 0 , 0 , Einstellungen_wecker
Gosub Readtouch
If X > 45 And Y > 45 Then
If X > 16 And X < 248 And Y > 288 And Y < 976 Then : Showpic 0 , 0 , Einstellungen : Menu = 4 : End If
If X > 320 And X < 960 And Y > 336 And Y < 576 Then : Showpic 0 , 0 , Einstellungen_wecker1 : Menu = 21 : End If
If X > 320 And X < 960 And Y > 688 And Y < 928 Then : Showpic 0 , 0 , Einstellungen_wecker2 : Menu = 22 : End If
End If
Return

.
.
.
Readtouch:
Config Pina.0 = Output ' Makes port F.0 output
Config Pina.2 = Output ' Makes port F.0 output
Set Porta.0 ' Sets port F.0 High
Reset Porta.2 ' Sets port F.2 Low
Ddra.1 = 0 ' Sets port F.1 as input
Ddra.3 = 0 ' Sets port F.1 as input because we need it now as ad input
Waitms 20 ' Wait until the port is stable
Y = Getadc(3) ' Read the ad value for the y
Y = 1024 - Y ' Invert the reading
'Print "VALUE Y : " ; Y ' for debugging
Config Pina.1 = Output ' Makes port F.1 output
Config Pina.3 = Output ' Makes port F.3 output
Reset Porta.1 ' Sets port F.1 Low
Set Porta.3 ' Sets port F.3 High
Ddra.0 = 0 ' Sets port F.0 as input
Ddra.2 = 0 ' Sets port F.2 as input because we need it now as ad input
Waitms 20 ' Wait until the port is stable
X = Getadc(2) ' Read the ad value for the x
X = 1024 - X ' Invert the reading
'Print "VALUE X : " ; X
If X > 45 And Y > 45 And Beltimeist <= 0 Then : Beltimeist = Beltimesoll : Menutimeist = Menutimesoll : Displaybel = 1 : X = 0 : Y = 0 : Wait 1 : End If
Return


Cntfull:
Timer1 = 62410
If Synchro = 1 Then
Dcf77 = 1
If Pinb.1 = 1 Then
If P = 1 Then
Select Case Wert
Case 21 To 28 : Gosub Minuten
Case 29 To 35 : Gosub Stunden
Case 36 To 41 : Gosub Kltag
Case 42 To 44 : Gosub Wotag
Case 45 To 49 : Gosub Monat
Case 50 To 58 : Gosub Jahr
End Select
Wert = Wert + 1
If Test > 17 Then : Wert = -1 : End If ' Minute = 0 : Stunde = 0 : Tag = 0 : Klmon = 0 : Kljahr = 0 : Wotag = 0 : End If
If Test = 8 Then : Status = 1 : End If
If Test = 9 Then : Status = 0 : End If
End If
Test = 0 : P = 0
Else : P = 1
End If
If P = 1 Then
Test = Test + 1
End If
End If
If Synchro = 0 Then : If Minute = 42 And Stunde = 20 Then : Synchro = 1 : Wert = -1 : End If : End If
If Synchro = 0 Then : Sekunden = Sekunden + 1 : End If
If Sekunden > 599 Then : Cls : Sekunden = 0 : Minute = Minute + 1 : Gosub Formattime : Gosub Timecheck : End If
If Minute > 59 Then : Minute = 0 : Stunde = Stunde + 1 : Gosub Formattime : Gosub Timecheck : End If
If Stunde > 23 Then : Stunde = 0 : Synchro = 1 : Gosub Formattime : Gosub Timecheck : End If
If Beltimeist > 0 Then : Beltimeist = Beltimeist - 1 : End If
If Menutimeist > 0 Then : Menutimeist = Menutimeist - 1 : End If
If Displaytime > 0 Then : Displaytime = Displaytime -1 : End If
Return


Mainmenu:
$bgf "Mainmenu1.bgf"
Musik:
$bgf "musik.bgf"
Musikplayer:
$bgf "Musik_player.bgf"
Musiknoconn:
$bgf "Musik_noconnection.bgf"
Steuerung:
$bgf "steuerung.bgf"
Pccontrol:
$bgf "PCControl.bgf"
Einstellungen:
$bgf "Einstellungen.bgf"
Einstellungen_beltime:
$bgf "Einstellungen_Beltime.bgf"
Einstellungen_menutime:
$bgf "Einstellungen_Menutime.bgf"
Einstellungen_nachts_aus:
$bgf "Einstellungen_Nachts_Aus.bgf"
Einstellungen_nachts_ein:
$bgf "Einstellungen_Nachts_Ein.bgf"
Einstellungen_nachts_eingabe_bis:
$bgf "Einstellungen_Nachts_Eingabe_Bis.bgf"
Einstellungen_nachts_eingabe_von:
$bgf "Einstellungen_Nachts_Eingabe_Von.bgf"
Tv:
$bgf "TV.bgf"
Internet:
$bgf "Internet.bgf"
Wlan:
$bgf "Wlan.bgf"
Neon:
$bgf "Neon.bgf"
Lichterkette:
$bgf "Lichterkette.bgf"
Musikanlage:
$bgf "sound.bgf"
Einstellungen_steuerung_time:
$bgf "Einstellungen_Steuerung_Time.bgf"
Stehlampe:
$bgf "Stehlampe.bgf"
Leuchtkugel:
$bgf "Leuchtkugel.bgf"
Einstellungen_wecker1:
$bgf "Einstellungen_Wecker1.bgf"
Einstellungen_wecker2:
$bgf "Einstellungen_Wecker2.bgf"
Einstellungen_wecker_zeit:
$bgf "Einstellungen_Wecker_Zeit.bgf"
Einstellungen_wecker_tag:
$bgf "Einstellungen_Wecker_Tag.bgf"
Einstellungen_wecker:
$bgf "Einstellungen_Wecker.bgf"

$include "font8x8.font"



so insgesamt sind das so an die 22 Menus aber die wollt ich jetzt nicht alle posten=). hab leider keine Idee woran das liegen kann. Auch wenn ich $eepromhex verwende ändert sich nichts.

Blue72
07.11.2008, 13:37
Na das sieht ja sehr umfangreich aus.

Also erstmal musst Du zwischen EEPROM und normalem Speicher unterscheiden. Für den normalen Speicher kannst Du Dir die Anweisungen
$EEPROM und $EEPROMHEX sowieso sparen.

Bilder ins EEPROM legen:


$EEPROM
$EEPROMHEX ' speichert die EEPROM Daten direkt im Intel Hex Format in Deinem Arbeitsverzeichnis, dieses File (meinprogramm.eep) musst Du gesondert in den AVR hochladen)

Bild1:
$bgf "bild1.bgf"

Bild2:
$bgf "bild2.bgf"
.
.
.
Bild100:
$bgf "bild100.bgf"

$Data ' WICHTIG

'Diese Zeilen am Anfang Deines Programmes setzen.


Ein Bild aus dem EEPROM anzeigen musst Du dann mit

ShowpicE 0, 0, Bild1


Bilder aus dem normalen Speicher Deines AVR liest Du nur mit:


Showpic 0, 0, Bild1

'und bindest diese am Ende Deines Programmcodes mit

:bild1
$bgf "bild1.bgf"

ein.


Ich könnte mir vorstellen das genau das Dein Problem ist.

Gruß
Jens

MelMan
07.11.2008, 14:57
so habs genau so gemacht wie du gesagt hast:

$eeprom
Bild1:
$bgf "..."
.
.
.
$data

$regfile = "m644def.dat"
$framesize = 54
$swstack = 128
$hwstack = 64
$crystal = 8000000
$baud = 9600
.
.
.



Aber ist noch immer der selbe Fehler. Das Anfangbild zeit er ohne Probleme an aber sobald ich das menu wechsel bekomm ich nur noch wirsches zeug.

Blue72
07.11.2008, 16:11
Mach das mal besser nach $baud, also erst die Initialisierung des Prozis.

Hast Du denn auch das EEPROM mit Deinen Daten geladen ?

Probier mal folgendes:




$regfile = "m644def.dat"
$framesize = 54
$swstack = 128
$hwstack = 64
$crystal = 8000000
$baud = 9600

$eeprom
$eepromhex

Bild1:
$bgf "..."
.
.
.
.
$data


showpice 0 , 0, eeprom1 'Bild1 aus dem EEPROM
wait 2
showpice 0, 0, eeprom2 'Bild aus dem EEPROM

end




Womit proggst Du Deinen AVR ?

Gruß
Jens

MelMan
07.11.2008, 18:15
Progge mit Bascom. Lade dann einmal das Programm in den Flash und dann über EEPROM die Daten in den EEPROM. Also mit $eepromhex geht es gar nicht da bekomm ich nichtmal ein ordentloches bild und ohne geht auch nicht. immer noch der selbe fehler. das problem ist dass ich nicht mit AVR Studio proggen kann da ich den ISP Dongle dongel über LPT habe.

Blue72
07.11.2008, 19:54
Ahso ... also $eepromhex brauchst Du nur damit Bascom Dir ein Intel-Hex file erzeugt, welches Du in Bascom (oder WinAVR) getrennt vom Programm upload als eeprom file laden kannst (bei mir musste ich diesen Umweg gehen, da mir auch nur Müll angezeigt wurde).

Hast Du mal versucht den HWStack zu erhöhen oder die Framesize ?
Oder hast Du mal versucht nur ein Beispielprogramm mit $bgf hochzuladen ohne Dein jetziges Programm ?

MelMan
08.11.2008, 10:43
Hmm also wenn ich einzelne Bilder anzeigen lasse geht das einwandfrei. Mir ist das was aufgefallen. Der ATMEGA644 hat 64K Bytes Flashspeicher aber nur 2K EEPROM Speicher. Könnte das sein dass die Bilder einfach viel zu groß sind? Denn ein einzeles ist nicht so groß und da klappt es aber ab ca. 3 Bilder bekomm ich nur Müll :-k

Blue72
08.11.2008, 10:47
Klar kann das sein. Wie groß sind denn die Bilder (Dateigröße) ?

MelMan
08.11.2008, 11:51
Pro Bild 2KB. Ich denke mal das wird das Problem sein

Edit: 1KB, deshalb auch erst ab drei Bildern probleme denk ich

Blue72
08.11.2008, 11:58
Genau da liegt Dein Problem :-)

MelMan
08.11.2008, 13:17
man man man war das schwer xD. Vielen Dank für deine Hilfe und dein Hartnäckiges Dranbleiben am Thema. hat mir echt geholfen. wünsch dir noch eine schönes WE.

Blue72
08.11.2008, 15:26
Danke, dafür ist das Forum ja da :) Aber noch was: Wie groß ist denn eins Deiner Bilder (X x Y pixel) ?

Bauteiltöter
08.11.2008, 16:59
Bei 1kB würde ich auf 128x64 tippen, denn meine 240x128 .bgf-Dateien haben 2kB...

MelMan
08.11.2008, 17:01
Jop ist 128x64.

Blue72
08.11.2008, 18:12
Kannst Du mal eines Deiner Bilder anhängen ? Vielleicht hab ich ja noch ne idee ...

Gruß
Jens

MelMan
09.11.2008, 15:00
Jop hier einmal die .bmp und .bgf

Blue72
09.11.2008, 15:04
Du könntest z.B. die Icon´s einzeln als bgf ablegen und die Umrandung mit line und circle Befehlen herstellen, so verschwendest Du nicht soviel
Speicherplatz für Leerräume. Nur so ne Idee.

Gruß
Jens

MelMan
09.11.2008, 15:24
Hmm ja stimmt das wäre auch noch eine Möglichkeit. Müsste ich mir nur eine Routine zusammenbasteln die mir je nach Menu andere Ränder ausgibt oder? Aber das wäre ja nicht das Problem. Geht mit dem befehl Line oder?

Blue72
09.11.2008, 15:29
Ja, guck mal in die Bascom Hilfe. Ich denke Du benötigst die Icons ja öfter,
und ein genereller Rahmen wie auf dem Bild ist ja schnell erstellt.

Gruß
Jens

MelMan
09.11.2008, 15:56
Ja gut werd ich mal ausprobieren. Viele Dank für deine Hilfe O:)