Forum: Mikrocontroller und Digitale Elektronik Hilfe, Bascom - loadlabel geht nur bis 64k


von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

Hallo, habe jetzt ein kleines Problem mit Bascom, für eine Sprachausgabe 
verwende ich die Befehle Loadlabel für den Sprachbefehl (z.B. Ziffern 
0-9, diverse Worte). Das Ganze geht wunderbar für Atmega644, allerdings 
haben nur wenige Worte Platz. Jetzt möchte ich das Ganze erweitern und 
habe einen Atmega1284P verwendet (128kB), doch loadlabel geht - wie ich 
nach längerem Suchen entdeckt habe - nur bis 64k Adressraum. Was nun? 
Kann ich die Speicheradresse irgendwie - vielleicht mit Assembler 
ermitteln?

Hier zur Info der Programmcode:
1
Timer0_isr:                                                 '4000 Hertz
2
'Achtung Byt etc. Übergabevariablen nicht verwenden,
3
'da parallel ablaufende Prozesse
4
'daher auch alles raus aus Timer
5
Timer0 = Ctimer0preload                    'zeitkritisch, daher am Anfang!
6
If Wrdsoundpos > 0 Then
7
  Ti = Cpeek(wrdsoundpos)  'Bereits jetzt nächstes Sample in Variable holen
8
  If Ti = 255 Then 'Endezeichen eines Wortes
9
      Wrdsoundpos = 0
10
      If Byttelpointer > 0 Then
11
         Decr Byttelpointer
12
      End If
13
  Else
14
     If Bittelpause = 0 Then
15
        Ocr1al = Ti
16
     End If
17
     Incr Wrdsoundpos
18
  End If
19
End If
20
If Byttelpointer > 0 Then
21
  If Wrdsoundpos = 0 Then
22
     Ti = Len(strtel) 'in strtel stehen die Wörter, zB. 012345,
23
     Ti = Ti - Byttelpointer
24
     Ti = Strtelbytes(ti + 1) 'strtelbytes=Overlay-Bytes zu strtel
25
     Bittelpause = 0
26
     Tccr1a = &B10000001        'Pin D5, OC1A, nicht invertiert, 8-Bit-...
27
     Tccr1b = &B00001001        '...Fast-PWM, Timer1 ohne Vorteilung 8x
28
     Select Case Ti
29
     Case 48
30
        Wrdsoundpos = Loadlabel(0) 'wrdsoundpos=Pointer ins Flash-ROM
31
        'Hier stehen im Data-Bereich Bytes für 4kHz Sprachausgabe, Ziffer 0
32
     Case 49
33
        Wrdsoundpos = Loadlabel(1)
34
     Case 50
35
        Wrdsoundpos = Loadlabel(2)
36
     Case 51
37
        Wrdsoundpos = Loadlabel(3)
38
     Case 52
39
        Wrdsoundpos = Loadlabel(4)
40
     Case 53
41
        Wrdsoundpos = Loadlabel(5)
42
     Case 54
43
        Wrdsoundpos = Loadlabel(6)
44
     Case 55
45
        Wrdsoundpos = Loadlabel(7)
46
     Case 56
47
        Wrdsoundpos = Loadlabel(8)
48
     Case 57 Lookup
49
        Wrdsoundpos = Loadlabel(9)
50
     Case 65                                                'A=Auto
51
        Wrdsoundpos = Loadlabel(auto)
52
     Case 77                                                'M=Minuten
53
        Wrdsoundpos = Loadlabel(minuten)
54
     Case 79                                                'O=Oben
55
        Wrdsoundpos = Loadlabel(oben)
56
     Case 82                                                'R=Reserve
57
        Wrdsoundpos = Loadlabel(reserve)
58
     Case 85                                                'U=Unten
59
        Wrdsoundpos = Loadlabel(unten)
60
     Case 88 To 255                         'X,Y,Z-Tonausgabe statt Sprache
61
        Wrdsoundpos = Loadlabel(1)          'Pausezeit=0-Zeit
62
        Tccr1a = &B01000000                  'CTC Pin D5, OC1A, CTC-Mode
63
        Tccr1b = &B00001101                  'CTC bei OCR1A, Prescaler=64
64
        Ocr1al = Ti - 86                     '1302/976/781 Hertz
65
        Tcnt1h = 0
66
        Tcnt1l = 0
67
        Bittelpause = 1
68
     Case Else
69
        Wrdsoundpos = Loadlabel(1)                  'Pausezeit=0-Zeit
70
        Ocr1al = &H84                                'neutraler Wert
71
        Bittelpause = 1
72
     End Select
73
  End If
74
End If
75
Return

von AVR-Fan (Gast)


Lesenswert?

Für den größeren Speicherraum benützt der ATMEGA1284
außer den X, Y, Z-Registern, die 16Bit breit sind,
noch ein zusätzliches Register. (Für die weiteren Adressleitungen)
Bascom kenne icht nicht, daher kann ich nicht sagen ob Du den
entstandenen ASM-Code ansehen kannst.
Dann könntest Du nämlich sehr schnell feststellen, ob Bascom
den Speicher überhaupt adressiert oder adressieren kann.

Den Namen dieses zusätzlichen Registers findest Du im Datenblatt bzw.
auch in der ASM-Hilfe vom AVR-Studio.

von Sven P. (Gast)


Lesenswert?

CPEEKH + CPEEK?

Dabei wird der Speicher allerdings in Seiten (Pages) zerlegt. Ob, wie 
und wo Bascom Konstanten im Programmspeicher ablegt, müsstest du mit dem 
Manual klären.

Oder ne gescheite Programmiersprache, in der es benutzbare Zeiger gibt. 
Damit ließe sich dein Programm sicherlich eleganter formulieren, ohne 
Gehirnzerknoten wegen Paging.

von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

Sven P. schrieb:
> CPEEKH + CPEEK?
>
> Dabei wird der Speicher allerdings in Seiten (Pages) zerlegt. Ob, wie
> und wo Bascom Konstanten im Programmspeicher ablegt, müsstest du mit dem
> Manual klären.
>
> Oder ne gescheite Programmiersprache, in der es benutzbare Zeiger gibt.
> Damit ließe sich dein Programm sicherlich eleganter formulieren, ohne
> Gehirnzerknoten wegen Paging.

Tja, die Zeiger gehen mir irgendwie schon ab - aber ansonst ist halt die 
Syntax so einfach...

Aber dein Hinweis mit CPEEKH ist schon einiges Wert, ich könnte mir 
vorstellen, dass ich den Speicherbereich dann hardcodiere, da ich als 
Programmierer ja weiß, wo die DATA-Bereiche (in etwa) liegen. Also die 
hinteren Data-Bereiche liegen dann auf Page 2 und ich muss mit Peekh 
zugreifen. Ist halt nicht wirklich elegant, naja vielleicht wird Mark 
noch den loadlabel-Befehl um einen loadlabelh erweitern.

von Sven P. (Gast)


Lesenswert?

Manfred S. schrieb:
> Tja, die Zeiger gehen mir irgendwie schon ab - aber ansonst ist halt die
> Syntax so einfach...

Naja, gerade das verstehe ich ja nicht. Du betreibst da im Wesentlichen 
ja nur Bitfummelei -- auf die Möglichkeiten (insbesondere CONFIG) von 
Bascom greifst du garnicht zurück.

Und so besteht dein Programmtext im Wesentlichen nur aus einer Seite 
Fließtext von überflüssigen Zeichen, weil Basic halt so geschwätzig ist 
:-)

von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

wie soll das Speicherauslesen mit config funktionieren??

wenn Du den Timer meinst, da geht es einfacher und sicherer direkt mit 
Registerzugriffen

von Sven P. (Gast)


Lesenswert?

Ja, den Timer meine ich zum Beispiel.

Sonst ist da ja nichts, außer geschwätzigem Basic.

von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

So - Problem gelöst. Ich positioniere einfach mit Restore den 
Data-Zeiger und lese dann die Bytes von der Position bis zur Endemarke 
($FF) ein. Interessant ist nur, dass auch lookup nur mit 64k kann (habs 
getestet), Restore aber problemlos mit den 128k zurechtkommt. Hier noch 
der korrigierte Code..
1
Timer0_isr:                                                 '4000 Hertz
2
'Achtung Byt etc. Übergabevariablen nicht verwenden,
3
'da parallel ablaufende Prozesse
4
'daher auch alles raus aus Timer
5
Timer0 = Ctimer0preload        'zeitkritisch, daher am Anfang!
6
If Bitplayspeech > 0 Then
7
  Read Ti            'Lese ab Restore-Zeiger Bytes für Sprachausgabe
8
  If Ti = 255 Then
9
      Bitplayspeech = 0
10
      If Byttelpointer > 0 Then  'Ausgabe der Wörter nacheinander bis Ende
11
         Decr Byttelpointer
12
      End If
13
      If Byttelpointer = 0 Then 'Ansage am Telefon bis lngtelselbstrpt wh.
14
         If Lngtelselbstrpt > 0 Then
15
            Byttelpointer = Len(strtel)
16
            Decr Lngtelselbstrpt
17
         Else
18
            Tccr1a = 0                                      'Ton aus
19
            Tccr1b = 0
20
         End If
21
      End If
22
  Else
23
     If Bittelpause = 0 Then    'Trick: Sprachausgabe leer für Pause
24
        Ocr1al = Ti
25
     End If
26
  End If
27
End If
28
If Byttelpointer > 0 Then
29
  If Bitplayspeech = 0 Then                 '1 Wort fertig ausgegeben?
30
     Ti = Len(strtel)
31
     Ti = Ti - Byttelpointer
32
     Ti = Strtelbytes(ti + 1)
33
     Bittelpause = 0
34
     Bitplayspeech = 1 'Sprachausgabe des Wortes bei nächstem Timeraufruf
35
     Tccr1a = &B10000001   'Pin D5, OC1A, nicht invertiert, 8-Bit-...
36
     Tccr1b = &B00001001   '...Fast-PWM, Timer1 ohne Vorteilung 8x
37
     Select Case Ti
38
     Case 48
39
        Restore 0
40
     Case 49
41
        Restore 1
42
     Case 50
43
        Restore 2
44
     Case 51
45
        Restore 3
46
     Case 52
47
        Restore 4
48
     Case 53
49
        Restore 5
50
     Case 54
51
        Restore 6
52
     Case 55
53
        Restore 7
54
     Case 56
55
        Restore 8
56
     Case 57
57
        Restore 9
58
     Case 65                                                'A=Auto
59
        Restore Auto
60
     Case 77                                                'M=Minuten
61
        Restore Minuten
62
     Case 79                                                'O=Oben
63
        Restore Oben
64
     Case 82                                                'R=Reserve
65
        Restore Reserve
66
     Case 85                                                'U=Unten
67
       Restore Unten
68
     Case 88 To 255                                         'X-Ton usw.
69
        Restore 1                        'Pausezeit=Zeit wie für 0-Zeit
70
        Tccr1a = &B01000000              'CTC Pin D5, OC1A, CTC-Mode
71
        Tccr1b = &B00001101              'CTC bei OCR1A, Prescaler=64
72
        Ocr1al = Ti - 86                 '1302/976/781 Hertz
73
        Tcnt1h = 0
74
        Tcnt1l = 0
75
        Bittelpause = 1
76
     Case Else
77
        Restore 1                    'Pausezeit=Zeit wie für 0-er
78
        Ocr1al = &H84                'neutraler Wert, kein Knacksen
79
        Bittelpause = 1
80
     End Select
81
  End If
82
End If
83
If Wrdplaydauer > 0 Then
84
   Decr Wrdplaydauer
85
   If Wrdplaydauer = 0 Then
86
       Tccr2a = &B00000000                                  'Ton aus
87
   End If
88
End If
89
If Byttimer20 > 0 Then
90
   Decr Byttimer20
91
End If
92
If Byttimer200 > 0 Then
93
   Decr Byttimer200
94
End If
95
Return

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.