mega16, RC5 und Bascom

Liebe Gemeinde,

ich habe nunmehr folgendes Problem: ich benutze einen ATmega16 und IR-empfang mit bascom. Bei getrc5(adresse,befehl) springt die Ausführung im Simulator, wie auch in Natura, zur ersten Programzeile und dann zur letzten und dann immer wieder zur ersten und zur letzten und so weiter.

Hat eventuell jemand einen Tipp für mich? wenn ich die interrrupts ausschalte bleibt er auf getrc5 hängen und bearbeitet den befehl endlos. habe viele Variablen im Speicher, teilweise direkt mit speicherplatz zugewiesen, teilweise deaktivieren geht auch nicht. es ging aber mal, änderung zwischendurch waren vor allem auslagerungen von routienen und subs.

Kann mich mal bitte jemand anstoßen, irgendwas abstraktes was ich vielleicht verhauen haben könnte.

THX und bye uwe

--
AIM: hammernocker2000 ## ICQ: 115118874 ## www.pssgzudresden.de
Jürgen Gerkens in d.r.f. : "... gerade ein Polfilter ist als
Schutzfilter auch nicht viel schlauer, als die Frontlinse zum Schutz
vor Streulicht zu lackieren. ;-)"
Reply to
Uwe 'hammernocker' Roßberg
Loading thread data ...

hast du die $sim option drin?

haben alles Subs ein Return?

Steht das "end." am Ende aller Subs oder nach den do..loop?

....sag bescheid ob du es hinbekommen hat und woran es lag?

MfG.

Reply to
Stefan "Hänky"

Stefan "Hänky" schrieb:

gerade reingemacht

ja

es steht der übersichtlichkeit halber ganz am schluss als letzte Zeile, ohne das end springt er immer zu der bis dahin letzten physischen Zeile, die das Return eines Interrupt-Sprungziels beinhaltet. Interrupts (UART) werrden übrigens normal bearbeitet. Es ist als wenn die Schleife Leer wäre, er springt mei getrc5 aus dieser raus (offensichtlich, also auch im controller). Meine Kontrollpins werden nicht geschaltet.

Bis dato keine aussicht auf Erfolg

THX, bye uwe

--
AIM: hammernocker2000 ## ICQ: 115118874 ## www.pssgzudresden.de
Jürgen Gerkens in d.r.f. : "... gerade ein Polfilter ist als
Schutzfilter auch nicht viel schlauer, als die Frontlinse zum Schutz
vor Streulicht zu lackieren. ;-)"
Reply to
Uwe 'hammernocker' Roßberg

Hallo,

"Uwe 'hammernocker' Roßberg" schrieb im Newsbeitrag news:e3i6cq$64o$ snipped-for-privacy@online.de...

Dann poste doch mal deinen Code.

Jan

Reply to
Jan Fischer

Jan Fischer schrieb:

Unglaublich, habe den Fehler gefunden. Es ist so das getrc5 erstmal wartet ob was kommt, das dauert in der Sim ne ganze weile (reichlich 2 millionen takte werden angegeben). ich habe das einfach mal ausgesessen und festgestellt das es tatsächlich weitergeht, und zwar planmässig, bis zu der stelle wo vergeblich auf eine antwort vom i2c bus gewartet wird. Aufgefallen ist es mir als ich gemerkt hatte das SCL auf Low-Pegel lag, also musste die stelle ja irgendwie im code passiert worden sein.

jedenfalls schlage ich mich nun mit anderen Problemem rum, nämlich der korrekten interpretation der empfangenen Befehle. Die Weiterleitung per i2c ist erstmal deaktiviert, die werde ich wohl aus Slave-Sicht bearbeiten müssen ;o))

Code folgt trotzdem als Antwort auf dieses Posting (damit man es getrost ignorieren kann)

bye uwe

--
AIM: hammernocker2000 ## ICQ: 115118874 ## www.pssgzudresden.de
Jürgen Gerkens in d.r.f. : "... gerade ein Polfilter ist als
Schutzfilter auch nicht viel schlauer, als die Frontlinse zum Schutz
vor Streulicht zu lackieren. ;-)"
Reply to
Uwe 'hammernocker' Roßberg

Wie der geübte Programmierer leicht erkennen kann handelt es sich um eine zusammenstellung aus verschiedenen Quellen, die kommentare stimmen teilweise nichtmehr mit dem code überein ;o)) sowas, da war gerade noch eine telefonnummer mitten im code, die ich mir heute fix notiert hatte ;o)) geradenochso gefunden ;o))

$regfile = "m16def.dat" 'ATMega16 $crystal = 16000000 'Quarz:

3.6864 MHz $baud = 9600 'Baudrate der UART: 9600 Baud Config Rc5 = Pinc.6 , Timer = 2 $hwstack = 32 ' default use 32 for the hardware stack $swstack = 10 ' default use 10 for the SW stack $framesize = 40 ' default use 40 for the frame space

' PD4 an Taste 2, PD3 (Int1) an Taste 1 ' PD2 (Int0) an RTS-Ausgang vom MAX232

Ddra = &B00000000 'Pa3 Eingang, komplett Porta = &B00011111 Ddrb = &B11111111 Portb = &B00000000 Ddrc = &B10111111 Portc = &B01000111 Ddrd = &B11111000 'Ddrd = &B00000000

$lib "mcsbyte.lbx" $lib "i2c_twi.lbx" Config Sda = Portc.1 Config Scl = Portc.0 'I2cinit

Dim Dmx(100) As Byte At &H60 Dim Dmxmute(100) As Byte Dim Ftoggle As Bit , Dmxstatus As Byte , Datenraus As Bit Dim Dmxadress As Byte Dim Dmx1 As Byte At &H61 Overlay , Dmx2 As Byte At &H62 Overlay , Dmx3 As Byte At &H63 Overlay , Dmx4 As Byte At &H64 Overlay , Dmx5 As Byte At &H65 Overlay Dim Dmx6 As Byte At &H66 Overlay , Dmx7 As Byte At &H67 Overlay , Dmx8 As Byte At &H68 Overlay , Dmx9 As Byte At &H69 Overlay , Dmx10 As Byte At &H6A Overlay Dim Address As Byte , Command As Byte , Rohcommand As Byte , Alt As Byte , Zeit As Word 'für IR Dim S As Byte , Mute As Byte , Temp As Byte , Hatsichwasgetan As Byte , Adresseingabe1 As Byte , Adresseingabe2 As Byte Dim Tutsichwas As Byte

Dim Twi_control As Byte ' Controlrgister lokale kopie Dim Twi_status As Byte Dim Twi_data As Byte Dim B As Byte ' Zeichen von UART Dim Error As Byte ' Fehlermerker

Declare Sub Twi_send_byte(byval Slave As Byte , Byval Zeichen As Byte)

' TWI init Twcr = &B00000100 ' erstmal nur TWI aktivieren Twsr = 0 ' Status und Prescaler Register Twbr = 72 ' Bit Rate Register, 100kHz

Portb.5 = 1 Dmx1 = 1 Dmx2 = 2 Dmx6 = 6 Dmx7 = 7

On Urxc Onrxd 'Interrupt-Routine setzen Enable Urxc 'Interrupt URXC einschalten Enable Interrupts 'Interrupts global zulassen '---------------------------------------------------------

Do 'Hauptschleife Getrc5(address , Rohcommand) If S > 0 Then Command = S Rohcommand = S S = 0 End If Dmx(1) = Dmxadress If Rohcommand < 255 Then Command = Rohcommand And &B01111111 Print Address ; Print " " ; Print Command ; Print "---" ; Print Rohcommand If Command > 9 Then Adresseingabe1 = 0 If Alt = Rohcommand Then Tutsichwas = 2 Else Tutsichwas = 1 End If End If

If Tutsichwas = 1 Then Select Case Command Case 32 : Incr Dmxadress Case 33 : Decr Dmxadress Case 16 : Incr Dmx(dmxadress) Case 17 : Decr Dmx(dmxadress) Case 12 : Gosub Ontaste12 Case 13 : Gosub Onmute Case 52 : Dmx(dmxadress) = 255 Case 55 : Dmx(dmxadress) = 0 End Select If Command < 10 Then Gosub On0_9 End If

If Tutsichwas = 2 Then Select Case Command Case 16 : Incr Dmx(dmxadress) Case 17 : Decr Dmx(dmxadress) End Select End If

if tutsichwas>0 then Command = 0 'Dmx10 = Command ' Den Wert zum Slave senden ' Call Twi_send_byte(&H40 , Dmx10)

' Ausgabe, damit wir sehen was geschehen ist Print "dmxadresse: " ; Print Dmxadress; Print " wert : " ; Print Dmx(dmxadress); Print " error: "; Print Hex(error) ' error status Ausgeben tutsichwas=0 endif

Waitms 1 Portc.7 = 1 Select Case Command Case 2 : Incr Dmx1 Case 1 : Decr Dmx1 Case 4 : Incr Dmx2 Case 5 : Decr Dmx2 Case 7 : Decr Dmx3 Case 8 : Incr Dmx3 Case 32 : Print "ch+" Case 33 : Print "ch-" Case 16 : Print "V+" Case 17 : Print "V-" End Select

Waitms 1 Portc.7 = 0 Command = 0

Loop '---------------------------------------------------------

' TWI send_byte ' sendet ein Byte und schliesst die Übertragung ab Sub Twi_send_byte(slave As Byte , Zeichen As Byte) Error = 0 ' Fehler zurücksetzen

' Startbedingung Twcr = &B10100100 ' TWINT | TWSTA | TWEN

' warten bis TWINT gesetzt ist Gosub Twi_wait_int

' wenn Zugriff auf den Bus erlaubt, Slaveadresse ausgeben If Twi_status = &H08 Or Twi_status = &H10 Then Twdr = Slave And &HFE ' slave adresse + Write Twcr = &B10000100 ' TWINT löschen, Byte senden

' warten bis TWINT gesetzt ist Gosub Twi_wait_int

' Slave hat sich gemeldet If Twi_status = &H18 Or Twi_status = &H20 Then Temp = 0 Do 'zählschleife Incr Temp Twdr = Dmx(temp) ' Daten Twcr = &B10000100 ' TWINT löschen, Byte senden

' warten bis TWINT gesetzt ist Gosub Twi_wait_int Loop Until Temp = 100 'bis temp 100 ' Zeichen wurden gesendet If Twi_status = &H28 Or Twi_status = &H30 Then Error = 0 ' kein Fehler Else Error = Twi_status ' Fehler End If

Else ' kein slave Error = Twi_status ' Fehler End If

' Stopbedingung kommt hier immer im Ablauf, egal welcher Status Twcr = &B10010100 ' TWINT löschen, Stop senden

Else ' Bus belegt, wird er wieder freigegeben Twcr = &B10000100 ' TWINT löschen, Bus freigeben Error = Twi_status ' Fehler End If

End Sub

' warten bis TWINT gesetzt ist, status auslesen Twi_wait_int: Do Twi_control = Twcr And &H80 Loop Until Twi_control = &H80

Twi_status = Twsr And &HF8 ' status

' status nur zu Debugzwecken ausgeben, weil Bus sehr langsam wird ! ' Print "Err " ; Hex(twi_status) Return

On0_9: If Adresseingabe1 = 0 Then Adresseingabe2 = Command Adresseingabe1 = 1 Elseif Adresseingabe1 = 1 Then Dmxadress = Adresseingabe2 * 10 Dmxadress = Dmxadress + Command Adresseingabe1 = 0 Adresseingabe2 = 0 End If Return

Ontaste12: Temp = 0 Do Incr Temp Dmx(temp) = 0 Loop Until Temp = 100 Return

Onmute: If Dmx(dmxadress) > 0 Then Dmxmute(dmxadress) = Dmx(dmxadress) Dmx(dmxadress) = 0 Else Dmx(dmxadress) = Dmxmute(dmxadress) End If Return

Onrxd: S = Udr 'Byte aus der UART auslesen Print S 'Byte als Echo zurückgeben If S = "x" Then Print "->IKS

Reply to
Uwe 'hammernocker' Roßberg

Uwe 'hammernocker' Roßberg schrieb:

Also da ich nun gemerkt habe das das erstmal soweit normal ist(*1), habe ich das problem weiter Lokalisiert. Immerhin schaffe ich es ein einzelnes Byte per I2C zu übertragen. Der Master sendet mehrere Bytes, diese werden nacheinander abgeholt, jeweils bein nächsten Durchlauf des Slave durch die TWI-Routine. Ich möchte aber gerne das mehrere Bytes nacheinander abgeholt und per Zähler in ein Array geschrieben werden. Vielleicht kann jemand im Folgenden Codeschnipsel erkennen wo der Controller hängen bleibt, leider tu ich mich hier schwer das zu simulieren, ich habe offengestanden keine Ahnung wie ich das bewerkstelligen soll:

Neuesbyte = 0 Temp = 0 ' schauen ob TWINT gesetzt ist Twi_control = Twcr And &H80 ' Bit7 von Controlregister

Twi_status = Twsr And &HF8 ' Status If Twi_control = &H80 Then

'do Twi_status = Twsr And &HF8 ' Status If Twi_status = &H80 Then ' wurde ein Byte geschickt incr temp dmx(temp) = Twdr ' neue Daten merken Neuesbyte = 1 ' merken das ein neues Byte da ist End If Twcr = &B11000100 ' TWINT löschen, erzeugt ACK 'loop until twi_status= &ha0 end if

Ich hatte dei Vermutung das ich die Schleife durch abfrage des Stop-Signals beenden kann, geht so aber nicht. Ausserdem habe ich vermutet das ich die ACK-Zeile direkt nach dem 'Neubytemerker' plazieren kann, damit twint nicht jedesmal gelöscht wird, auch wenn ich noch garnicht gemerkt habe das das nächste byte geradeeben angekommen ist. Scheinbar geht es mehrere Zyklen lang, bis eben das Eintritt.

So, mit auskommentierter Schleife bekomme ich eben genau ein byte, bzw jedesmal das nächste auf das gleiche Feld.

Ich möchte 100byte in einem Zug übertragen, weil der gesamtablauf nur rund 40x pro sekunde hier vorbei kommt (es wird ein DMX-Signal ausgegeben).

Leider habe ich kein anderes, selbstständig I2C-fähiges, Gerät um die Funktion des Senders zu prüfen. Allerdings lasse ich mir dort die Fehlermeldungen seriell schicken, und da funktioniert es offensichtlich ganz gut.

Kann mir jemand einen Tipp geben wie ich die Schleife Platzieren muss? Ich hatte auch schon probiert die Durchläufe zu zählen, kommt aber zum gleichen Ergebniss. TWI-Control komplett mit eingebunden, also die Schleife um das ganze Stück drumrum, ging auch nicht.

Wäre Dankbar für einen Tipp der mich anschiebt. THX und bye uwe

(*1): getrc5 wartet ob was kommt, und das dauert seine zeit. der Controller ist stattdessen rund 130ms später in der TWI-Routine hängen geblieben.

--
AIM: hammernocker2000 ## ICQ: 115118874 ## www.pssgzudresden.de
Jürgen Gerkens in d.r.f. : "... gerade ein Polfilter ist als
Schutzfilter auch nicht viel schlauer, als die Frontlinse zum Schutz
vor Streulicht zu lackieren. ;-)"
Reply to
Uwe 'hammernocker' Roßberg

Liebe Gemeinde, es hilft häufig zu erklären was man für ein Problem hat. Ich habe gerade die Zündende Idee gehabt:

Neuesbyte = 0 Temp = 0 ' schauen ob TWINT gesetzt ist Twi_control = Twcr And &H80 ' Bit7 von Controlregister

Twi_status = Twsr And &HF8 ' Status If Twi_control = &H80 Then

----\ 'do ----/ Twi_status = Twsr And &HF8 ' Status If Twi_status = &H80 Then ' wurde ein Byte geschickt incr temp dmx(temp) = Twdr ' neue Daten merken Neuesbyte = 1 ' merken das ein neues Byte da ist End If Twcr = &B11000100 ' TWINT löschen, erzeugt ACK 'loop until twi_status= &ha0 end if

an der Markierten Stelle nochmal TWINT abfragen (innerhalb der schleife) und damit nur bei TWINT überhaupt die Routine anfangen und die zweite Abfrage jedesmal abarbeiten.

Ja ich führe oft selbstgespräche ;o))

THX und bye uwe

--
AIM: hammernocker2000 ## ICQ: 115118874 ## www.pssgzudresden.de
Jürgen Gerkens in d.r.f. : "... gerade ein Polfilter ist als
Schutzfilter auch nicht viel schlauer, als die Frontlinse zum Schutz
vor Streulicht zu lackieren. ;-)"
Reply to
Uwe 'hammernocker' Roßberg

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.