www.mikrocontroller.net

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


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Bernd S. (kurtel)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Tröte (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Bernd S. (kurtel)
Datum:

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

Autor: Wegstaben Verbuchsler (wegstabenverbuchsler)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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" ?

Autor: Bernd S. (kurtel)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
In Bascom gibt es Bit-Byte-Word-Long-Integer und Single.

Autor: Rene Zimmermann (renezimmermann)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Dim Minute As Long sollte helfen ohne den Rest jetzt angeschaut zu 
haben.

Autor: J.-u. G. (juwe)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Bernd S. (kurtel)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Rene Zimmermann (renezimmermann)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: cyblord ---- (cyblord)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Karl (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: Bernd S. (kurtel)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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üß

Autor: Karl (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

????

Autor: Bernd S. (kurtel)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Karl (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Bernd S. schrieb:
> Das "Dword" akzeptiert Bascom nicht.

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

Autor: Ralph (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Karl (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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_conten...

und dort unter
Dim My_long_1 As Long
...
...

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

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

Autor: Karl (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
PS. Natürlich darfst Du die Bytes nicht wie im Beispiel angegeben 
überschreiben.

Autor: Bernd S. (kurtel)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Erstmal Danke für eure Hinweise. Ich werde alles genau durchlesen und 
ausprobieren.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net