6 stellige Zahl auf Ram schreiben

OP #2647459
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
Gast #2647530
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.
Gast #2647731
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?
Gast #2647748
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.

????
OP #2647766
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.
Gast #2647788
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.
Gast #2647793
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren