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
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.
Danke für die aufschlußreiche Antwort. Nur weiß ich jetzt trotzdem nicht, ob oder wie das geht.
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" ?
Dim Minute As Long sollte helfen ohne den Rest jetzt angeschaut zu haben.
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.
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.
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.
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.
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?
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üß
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. ????
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.
Bernd S. schrieb: > Das "Dword" akzeptiert Bascom nicht. Ja, das geht erst ab einer bestimmten (neueren) Version.
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.
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?
PS. Natürlich darfst Du die Bytes nicht wie im Beispiel angegeben überschreiben.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.