Forum: Mikrocontroller und Digitale Elektronik 6 stellige Zahl auf Ram schreiben


von Bernd S. (kurtel)


Lesenswert?

Habe eine Problem bei dem ich nicht weiter weiß.
Aus meinen Programm schreibe ich die "Minuten" auf den SharedRam des 
"myEthernet" und lese sie dann mit der Webseite aus. Die Ausgabe auf der 
Wbseite funktioniert, aber nur bis Minute 128, dann geht es mit -128 
wieder rückwärts auf 0 und dann wieder aufwärts bis 128 und immer so 
weiter.
Die Ausgabe auf LCD geht bis 256 und fängt dann wieder bei 1 an. 
Meine Minuten sollen aber bis 120000 gezählt werden und werden dann vom 
Programm wieder auf 0 gesetzt.
Momentan sieht mein Programm so aus. Was muss ich da ändern?

'---------- AVR Einstellungen ----------
$regfile = "m8def.dat"                  'AVR ATMega 8...
$crystal = 3686400                      'mit 3686400 MHz
$hwstack = 100
$swstack = 100
$framesize = 100
'---------- I²C Einsatellungen ----------
$lib "i2c_twi.lbx"                     'Einbindung der I2C-Bibliothek
Config Twi = 100000                    'i2c Frequenz einstellen
Config Sda = Portc.4                   'i2c Port SDA am AVR
Config Scl = Portc.5                   'i2c Port SCL am AVR

'---------- LCD Einstellungen ----------
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , 
Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 4
Cursor Off Noblink                          'LCD = Cursor
'---------- Timer1 Deklaration--------------
Dim Sekunde As Word
Dim Minute As Word
Dim Liter As Single
Taster Alias Pinb.0
Config Portd = Output
Config Portb.0 = Input
Config Timer1 = Timer , Prescale = 8
On Timer1 Isr_von_timer1
Enable Interrupts
Timer1 = 61935
Dim A As Byte
Dim B As Byte
Dim Lesen As Byte
'----------= HAUPTPROGRAMM =----------
Cls                                       'LCD, Inhalt löschen
I2cinit                                   'Anschaltung des I2C-Busses
Do
  '--- schreiben in Ram ----
I2cstart                                  'Start I2C
I2cwbyte &HB0                             'Sende Slave Adresse
I2cwbyte 1                                'Sende Speicheradresse High
I2cwbyte A                                'Sende Speicheradresse LOw
I2cwbyte Minute                           'Sende Wert
I2cstop                                   'Stop I2C
Waitms 10                                 'warte 10ms

Locate 1 , 1
Lcd "Zeit: " ; Minute ; "  "              'Ausgabe geschriebenen Werte 
LCD
Waitms 500
'--- lesen vom Ram ----
I2cstart                                  'Start I2C
I2cwbyte &HB0                             'sende Slave Adresse
I2cwbyte 1                                'sende Speicheradresse High
I2cwbyte B                                'sende Speicheradresse Low
I2cstart                                  'Start I2C
I2cwbyte &HB1                             'sende Slave Adresse +1 für 
Lesen
I2crbyte Lesen , Nack                     'lese Adresse vom SharedRam
I2cstop                                   'Stop I2C

Locate 2 , 1
Lcd "Ram= " ; Lesen ; "  "                'Ausgabe der SharedRam Werte
Waitms 500
'--- IRS Routine ----
If Taster = 1 Then
Enable Timer1
Else
Disable Timer1
End If
Loop
End

Isr_von_timer1:
Incr Sekunde
If Sekunde = 60 Then Minute = Minute + 1
 If Sekunde = 60 Then Sekunde = 0
 If Minute = 120000 Then Minute = 0
Timer1 = 61935
Return

von Tröte (Gast)


Lesenswert?

Bernd S. schrieb:
> Meine Minuten sollen aber bis 120000 gezählt werden

120000 paßt weder in ein Word:

> Dim Minute As Word

noch in ein Byte:

> I2cwbyte Minute                           'Sende Wert

wobei das empfange Byte zu allem Überfluß auch noch als signed 
interpetiert werden kann:

> Wbseite funktioniert, aber nur bis Minute 128, dann
> geht es mit -128 wieder rückwärts auf 0

Datentypen existieren nicht zum Spaß, auch wenn man das angesichts 
mancher Basic-Dialekte vermuten könnte.

von Bernd S. (kurtel)


Lesenswert?

Danke für die aufschlußreiche Antwort.
Nur weiß ich jetzt trotzdem nicht, ob oder wie das geht.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Bernd S. schrieb:
> Nur weiß ich jetzt trotzdem nicht, ob oder wie das geht.

na, wenn der Datentyp (unsigned) Byte oder Word nicht ausreicht: gibt es 
denn in deinem Basic-Dialekt noch größere Datentypen, z.B. "long" ?

von Bernd S. (kurtel)


Lesenswert?

In Bascom gibt es Bit-Byte-Word-Long-Integer und Single.

von Rene Z. (renezimmermann)


Lesenswert?

Dim Minute As Long sollte helfen ohne den Rest jetzt angeschaut zu 
haben.

von J.-u. G. (juwe)


Lesenswert?

Bernd S. schrieb:
> In Bascom gibt es Bit-Byte-Word-Long-Integer und Single.

Prima, dann nimmst Du jetzt den, welcher groß genug ist, um

> 120000

darstellen zu können.

von Bernd S. (kurtel)


Lesenswert?

Long-Variablen haben den grössten Wertebereich.
Wertebereich: -2147483648 bis 2147483647
Hab umgestellt auf Long. Da ändert sich auf der Anzeige nichts.
Das Auslesen des Ram!s geht jetzt bis 255 und springt dann auf 0 um 
wieder von vorn anzufangen.

von Rene Z. (renezimmermann)


Lesenswert?

Long ist nun mal 4 Byte lang, das heist du mußt 4 Byte in den Speicher 
schreiben und natürlich auch 4 Byte wieder lesen. Ausserdem schreibst du 
auf $010A und liest von $010B.

von Cyblord -. (cyblord)


Lesenswert?

Du kannst doch von BASCOM "Programmierern" nicht verlangen dass sie sich 
in die Niederungen von Datentypen und Bytezählungen begeben. Am Ende 
müssen sie sich noch um die Endianess kümmern. Pfui.

von Karl (Gast)


Lesenswert?

Sehe ich das richtig?

Bernd S. schrieb:
> I2crbyte Lesen , Nack                     'lese Adresse vom SharedRam

> Lcd "Ram= " ; Lesen ; "  "                'Ausgabe der SharedRam Werte

I2Crbyte steht wahrscheinlich für "Read Byte" und es wird auch nur Byte 
gelesen. Wenn Du das auf dem LCD ausgibst, kann der Wert maximal 256 
sein. Oder habe ich etwas verpasst?

von Bernd S. (kurtel)


Lesenswert?

Naja, das war zwar keine nette Antwort, aber ich dachte das man als 
Anfänger hier etwas Hilfe bekommt. Zum Glück gibt es auch noch 
freundliche Menschen.
Falls ich an deiner Ehre als "Programmierer" gekratzt haben sollte, 
damit kann ich leben.

Tschüß

von Karl (Gast)


Lesenswert?

Bernd S. schrieb:
> Naja, das war zwar keine nette Antwort, aber ich dachte das man als
> Anfänger hier etwas Hilfe bekommt. Zum Glück gibt es auch noch
> freundliche Menschen.

Also war es das jetzt? Ich verstehe die ganze Problematik nicht richtig. 
Wenn Du die Variable "Lesen" ausgibst, dann ist das ein Byte, 8 Bit. 
Wenn Du die Variable "Minuten" ausgibst, kann das ist das ein Word, also 
16 Bit. 16 Bit reichen nicht für 120000, da brauchst Du Dword. Du gibst 
aber Minuten nicht auf dem LCD aus.

????

von Bernd S. (kurtel)


Lesenswert?

Die Ausgabe auf LCD habe ich nur zur Kontrolle mit rein geschrieben.
Ich möchte die Minuten nur auf den SharedRam des "myEthernet" schreiben 
um sie dann auf einer Webseite über "myEthernet" auszulesen.
Was Rene schreibt leuchtet mir jetzt ein.
>Long ist nun mal 4 Byte lang, das heist du mußt 4 Byte in den Speicher
>schreiben und natürlich auch 4 Byte wieder lesen.
Das Problem ist jetzt, das ich nicht weiss wie ich die 4 Byte einzelnen
reinschreibe bzw. auslese.Jetzt sieht das ja so aus:

I2cstart                                  'Start I2C
I2cwbyte &HB0                             'Sende Slave Adresse
I2cwbyte 1                                'Sende Speicheradresse High
I2cwbyte A                                'Sende Speicheradresse LOw
I2cwbyte Minute                           'Sende Wert
I2cstop                                   'Stop I2C
Waitms 10                                 'warte 10ms

Ich geh mal davon aus das jetzt nur ein Byte geschrieben wird.


Das "Dword" akzeptiert Bascom nicht.

von Karl (Gast)


Lesenswert?

Bernd S. schrieb:
> Das "Dword" akzeptiert Bascom nicht.

Ja, das geht erst ab einer bestimmten (neueren) Version.

von Ralph (Gast)


Lesenswert?

Betracht das mal nicht als persönlichen Angriff,  aber es ist doch sehr 
anstrengend wenn von 100 Fragen mindestens 80 damit zu tun haben das die 
Fragesteller nicht mal in der Lage sind die Grundlagen der verwendeten 
Sprache nachzulesen.

Dein Wert wechselt zwischen +-127 ==> Das heißt du hast eine Variable 
mit der Größe 1 Byte und Vorzeichen.
Da passt kein Wert größer +-127 rein.
Also keine Chance für dein 120000.

Wenn du wie jetzt weiter oben Vorgeschlagen auf einen anderen Datentyp 
wechselst bekommst du Werte zwischen 0 und 255.
==> das heißt das Vorzeichen ist so weg. Aber da ist immer noch die 
Größe 1 Byte.

Also ist irgendwo in dem Weg zwischen berechnen einer Minute > 255 und 
dem Ausgeben auf der Webpage eine Variable der Größe 1 Byte beteiligt.

Der Weg wäre jetzt der folgende.

Prüfe jede Stelle von der Berechnung der Minute bis zur Webpage an der 
der Wert angefasst wird auf die Größe der dort verwendeten Variablen.

Du wirst irgendwo auf diesem Weg eine Variable der Größe 1 Byte finden.
Dann weißt du wo es hängt.


Kleiner Tip zur Fehlersuche der immer zum Ziel führt. Und meistens der 
schnellste Weg ist.

FOLGE DEM SIGNAL.
Also geh zum letzten Punkt der Signalkette von dem du genau weißt das 
der Wert dort noch korrekt ist. Und folge dann dem Signalweg Schritt für 
Schritt über jeden Punkt an dem das Signal durchläuft ob Eingang und 
Ausgang deinen Erwartungen entspricht.

von Karl (Gast)


Lesenswert?

Zum anderen Problem:

Du musst Long oder Dword auf 4 Bytes aufteilen. Das ist an sich kein 
Problem:

http://www.mcselec.com/index.php?option=com_content&task=view&id=307&Itemid=57

und dort unter
1
Dim My_long_1 As Long
2
...
3
...

Dann muss in Deinem Code stehen (jeweils ein Byte)
1
I2cwbyte Minute
2
I2cwbyte Minute2
3
I2cwbyte Minute3
4
I2cwbyte Minute4

Ich kenne Dein System nicht. Kann Dein System diese 4 Bytes auch 
verarbeiten?

von Karl (Gast)


Lesenswert?

PS. Natürlich darfst Du die Bytes nicht wie im Beispiel angegeben 
überschreiben.

von Bernd S. (kurtel)


Lesenswert?

Erstmal Danke für eure Hinweise. Ich werde alles genau durchlesen und 
ausprobieren.

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.