www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RFM12 empfangen durch Interrupt


Autor: Mathias Dubdidu (darkfirefighter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich kann mit meinem RFM12 bereits empfangen allerdings blockiert mir das 
bisher den µC für andere Dinge. Deshalb wollte ich das empfangen 
Interrupt gesteuert machen. Beim lesen verschiedener Beiträge habe ich 
das so verstanden: Immer dann wenn nach 2D4D eine gewisse Anzahl x an 
Bytes im FIFO angekommen ist der nIRQ auf Low gezogen wird. Diesen Pin 
habe ich auf den INT0 meines Mega168 geklemmt.
Das Problem ist jetzt nur, dass kein Interrupt ausgelöst wird und auch 
der nIRQ dauernd auf Low ist. Leider habe ich noch aus keinem Beitrag 
entnehmen können welche Einstellungen ich genau zu machen habe.
Mein FIFO initialisiere ich mit
D = Spi16(0x82c8);
D = Spi16(0xca52);
Damit sollte ja nach 5 Byte der nIRQ auf Low gezogen werden oder?
Gesendet werden die Zahlen 12, 1, 0, 1, 12

Den Interrupt initialisiere ich folgendermaßen:
EIMSK |= (1<<INT0);
EICRA |= (1<<ISC01);
ISC01 = 1, da ich ja auf eine fallende Flanke reagieren will oder?

Meine Interruptroutine sieht so aus:
ISR(INT0_vect)
{
    PORTC |= (1<<PC4); //um zu sehen ob der Interrupt ausgelöst wurde
  
    for (N=1; N<=5; N++) //empfangen der 5 Byte
    {
      PORTB &= ~(1<<CS);

      D = Spi16(0xb000);
      data_in[N] = D;
    }

    D = Spi16(0x8208); //ausschalten und wieder einschalten des FIFO
    D = Spi16(0x82c8); //um weitern Empfang zu ermöglichen
    D = Spi16(0xca52);
}

Nur kommt es so leider nicht zu einem Interrupt.
Habe ich einen Denkfehler gemacht?
Wäre froh wenn ihr mir helfen könnt, da ich aus den vielen Beiträgen und 
Codeschnippseln die man so findet auch nicht schlau werde
Danke!

Grüße
Mathias

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Mathias Dubdidu schrieb:
> Das Problem ist jetzt nur, dass kein Interrupt ausgelöst wird und auch
> der nIRQ dauernd auf Low ist. Leider habe ich noch aus keinem Beitrag
> entnehmen können welche Einstellungen ich genau zu machen habe.
> Mein FIFO initialisiere ich mit
>
> D = Spi16(0x82c8);
> D = Spi16(0xca52);
> 
> Damit sollte ja nach 5 Byte der nIRQ auf Low gezogen werden oder?

Wo soll er die lassen? Er hat nur 16 BIT FIFO, Du mußt also jedes Byte 
abholen.
0xca81 ist sinnvoll.

Kannst ja hier mal reinschauen, läuft bei mir im Dauerbetrieb.

Beitrag "RFM12 Empfang von Sensordaten im IRQ"

Gruß aus Berlin
Michael

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist es dein einziger Interrupt im Programm?
Hast du auch ein "SEI"?

Autor: Mathias Dubdidu (darkfirefighter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael U. schrieb:
> Hallo,
>
> Mathias Dubdidu schrieb:
>> Das Problem ist jetzt nur, dass kein Interrupt ausgelöst wird und auch
>> der nIRQ dauernd auf Low ist. Leider habe ich noch aus keinem Beitrag
>> entnehmen können welche Einstellungen ich genau zu machen habe.
>> Mein FIFO initialisiere ich mit
>>
>> D = Spi16(0x82c8);
>> D = Spi16(0xca52);
>> 
>> Damit sollte ja nach 5 Byte der nIRQ auf Low gezogen werden oder?
>
> Wo soll er die lassen? Er hat nur 16 BIT FIFO, Du mußt also jedes Byte
> abholen.
> 0xca81 ist sinnvoll.

Ok das heißt mit 0xca81 würde er nach einem Byte mit nIRQ auf Low gehen 
und damit den Interrupt auslösen oder?
Und dann kann ich alles 5Byte nacheinander abhohlen


STK500-Besitzer schrieb:
>Ist es dein einziger Interrupt im Programm?
>Hast du auch ein "SEI"?

Ja ist mein einziger Interrupt habe auch ein sei()
direkt nach allen Initialisierungen und vor dem Aufruf der 
Endlosschleife

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mathias Dubdidu schrieb:
...
> for (N=1; N<=5; N++) //empfangen der 5 Byte
>     {
>       PORTB &= ~(1<<CS);
> 
>       D = Spi16(0xb000);
>       data_in[N] = D;
>     }
...
Ich sehe da schon das nächste Problem...

Hinweis als Frage definiert:
Wie (gross) ist dein "data_in" definiert?
bzw. Was steht in data_in[0]?

Autor: Mathias Dubdidu (darkfirefighter)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Werner B. schrieb:
> Mathias Dubdidu schrieb:
>
> ...
>> for (N=1; N<=5; N++) //empfangen der 5 Byte
>>     {
>>       PORTB &= ~(1<<CS);
>>
>>       D = Spi16(0xb000);
>>       data_in[N] = D;
>>     }
> ...
> 
> Ich sehe da schon das nächste Problem...
>
> Hinweis als Frage definiert:
> Wie (gross) ist dein "data_in" definiert?
> bzw. Was steht in data_in[0]?

data_in ist mit data_in[10] definiert. Den Eintrag bei Index 0 habe ich 
ausnahmsweise ignoriert, da ich das Programm von Bascom nach C übersetzt 
ist. (es handelt sich um das Programm aus der Elektor)
Das empfangen ansich funktioniert ja auch wenn ich andauernd die 
Empfangsfunktion aufrufe. Nur blockiert mir eben das dann den µC der 
eigentlich noch ein Lauflicht steuern soll. Ich habe mal das 
vollständige Programm angehängt.

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Mathias Dubdidu schrieb:
> Michael U. schrieb:
>> Hallo,
>>
>> Mathias Dubdidu schrieb:
>>> Das Problem ist jetzt nur, dass kein Interrupt ausgelöst wird und auch
>>> der nIRQ dauernd auf Low ist. Leider habe ich noch aus keinem Beitrag
>>> entnehmen können welche Einstellungen ich genau zu machen habe.
>>> Mein FIFO initialisiere ich mit
>>>
>>> D = Spi16(0x82c8);
>>> D = Spi16(0xca52);
>>> 
>>> Damit sollte ja nach 5 Byte der nIRQ auf Low gezogen werden oder?
>>
>> Wo soll er die lassen? Er hat nur 16 BIT FIFO, Du mußt also jedes Byte
>> abholen.
>> 0xca81 ist sinnvoll.
>
> Ok das heißt mit 0xca81 würde er nach einem Byte mit nIRQ auf Low gehen
> und damit den Interrupt auslösen oder?
> Und dann kann ich alles 5Byte nacheinander abhohlen

Nein. Rechne Dir aus, wie lange er bei Deiner Baudrate bracuhct, um 1 
Byte zu empfangen. Dann entscheide, ob Du per Polling in der ISR bleibst 
und auf die restlichen Bytes wartest (Abfrage des FIFO-Bits: SDI aof L, 
CS aktiv und SDO abfragen, bis es H wird -> FIFO-Byte da.
Wenn das Zeitverschwendung ist, hole das eine Byte ab, Du weist ja, 
wieviele Du sendest, also zwischenspeichern, Anzahl merken und eben auf 
den nächsten IRQ warten.
Wenn Du alle Bytes hast eben den FIFO neu starten.

Gruß aus Berlin
Michael

Autor: Mathias Dubdidu (darkfirefighter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael U. schrieb:
> Nein. Rechne Dir aus, wie lange er bei Deiner Baudrate bracuhct, um 1
> Byte zu empfangen. Dann entscheide, ob Du per Polling in der ISR bleibst
> und auf die restlichen Bytes wartest (Abfrage des FIFO-Bits: SDI aof L,
> CS aktiv und SDO abfragen, bis es H wird -> FIFO-Byte da.
> Wenn das Zeitverschwendung ist, hole das eine Byte ab, Du weist ja,
> wieviele Du sendest, also zwischenspeichern, Anzahl merken und eben auf
> den nächsten IRQ warten.
> Wenn Du alle Bytes hast eben den FIFO neu starten.


Ok der Befehl für die Baudrate ist ja dieser hier:
D = Spi16(0xc647)
das müssten dann 4,789kBd sein oder? Nach Wikipedia ist 1Bd = 
1Symbol/sekunde
Ist dann hier 1Symbol = 1Byte oder 1Bit?

Mein anderes Problem ist aber dass ich nicht mal in die ISR reinkomme. 
Wäre ich dann da drin würde ich per Polling bleiben und die restlichen 
Bytes abwarten

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.