Forum: Mikrocontroller und Digitale Elektronik RFM12 Interrupt gesteuert


von Jonas E. (jonas_e43)


Lesenswert?

Hallo,
seid kurzem versuche ich  mit der Hilfe von RFM12 Modulen eine Art Chat 
zu bauen. Dabei verwende ich zwei Pollin Funk-Evaluationboard, auf denen 
jeweils ein Atmega32 arbeitet. Eine Polling-Kommuniktation habe ich 
schon hinbekommen, in welcher das eine Board der Transmitter und das 
andere der Receiver ist. Nun ist es für mich an der Reihe dies Interrupt 
gesteuert hinzubekommen und desweiteren müssen beide Senden und 
Empfangen können.

Zu dem Thema RFM12 habe ich mir schon einige Threads im Forum angesehen, 
die mir aber nicht unbedingt weiterhelfen.
Der Thread von Benedikt über die Polling Kommunikation hat mich schon 
etwas nach vorne gebracht, aber jetzt komme ich nicht weiter voran :/.

Vielleicht hat ja schon jemand von euch ein ähnliches Problem gehabt und 
eine Lösung gefunden, die mir auch helfen könnte...

Gruß Jonas

von c-hater (Gast)


Lesenswert?

Jonas E. schrieb:

> Nun ist es für mich an der Reihe dies Interrupt
> gesteuert hinzubekommen und desweiteren müssen beide Senden und
> Empfangen können.
>
> Vielleicht hat ja schon jemand von euch ein ähnliches Problem gehabt und
> eine Lösung gefunden, die mir auch helfen könnte...

Wo soll denn da ein Problem sein? Der RFM12 hat einen Pin, über den er 
einen Interrupt auslösen kann, der Mega32 hat fünf interruptfähige 
Eingangspins. Knotest du also den einen an einen der anderen und 
programmierst ein wenig Software dazu.

Der Ablauf ist immer gleich: Als Reaktion auf den Interrupt 
Statusregister des RFM12 auslesen, um die auslösende Interruptquelle des 
RFM12 festzustellen und dann geeignet darauf reagieren.

So wie man das halt prinzipiell mit jeder externen Hardware machen muß, 
bei der es mehrere mögliche Interruptquellen gibt, die über nur einen 
Pin signalisiert werden.

Die einzige Schwierigkeit hier ist, daß du auch auf die Situation 
vorbereitet sein mußt, daß du auf den Int des RFM12 nicht unverzüglich 
reagieren kannst, weil du schon mit ihm (oder ggf. auch einem anderen 
Gerät am SPI-Bus) redest. Dann mußt du dir halt den Int merken und ihn 
dann behandeln, wenn du mit dem anderen Gequatsche fertig bist.

von Jonas E. (jonas_e43)


Lesenswert?

c-hater schrieb:
> Wo soll denn da ein Problem sein? Der RFM12 hat einen Pin, über den er
> einen Interrupt auslösen kann, der Mega32 hat fünf interruptfähige
> Eingangspins. Knotest du also den einen an einen der anderen und
> programmierst ein wenig Software dazu.

Alles klar. Ich habe jetzt den nIRQ Pin an den INT0 des Atmega32 
angeschlossen und den Interrupt auf eine fallende Flanke gelegt.
Als Beispiel habe ich diesen Code gefunden:
1
ISR(INT0_vect)
2
{
3
  PORTD |= (1<<PD6);
4
  static uint8_t daten[32];
5
  static uint8_t checksum = 0;
6
  static uint8_t bytecount = 0;
7
  uint8_t i, sensor_nr, byte;
8
9
  RFM12_PORT &= ~(1<<RFM12_CS);                  // CS auf L
10
  
11
  byte = 0xB0;                                  // Receive FIFO
12
13
  for (i=0; i<8; i++)                           // Kommando senden
14
  {
15
    if (byte & 0x80)
16
    {
17
      RFM12_PORT |= (1<<RFM12_SDI);          // DATA auf H
18
    }
19
    else
20
    {
21
      RFM12_PORT &= ~(1<<RFM12_SDI);        // DATA auf L
22
    }
23
    RFM12_PORT |= (1<<RFM12_SCK);              // CLK auf H
24
25
    byte = (byte << 1);                        // nächstes Bit nach oben
26
27
    RFM12_PORT &= ~(1<<RFM12_SCK);            // CLK auf L
28
  }
29
30
  byte = 0;
31
32
  for (i=0; i<8; i++)                           // FIFO Daten lesen
33
  {
34
    byte = (byte << 1);                        // eins höher schieben
35
    if ((RFM12_PIN & (1<<RFM12_SDO)))          // Bit 1?
36
    {
37
      byte = (byte | 0x01);                  // ja
38
    }
39
    RFM12_PORT |= (1<<RFM12_SCK);              // CLK auf H
40
    asm("nop");
41
    RFM12_PORT &= ~(1<<RFM12_SCK);            // CLK auf L
42
  }
43
  
44
  RFM12_PORT |= (1<<RFM12_CS);                  // CS auf H
45
46
  if (bytecount != (PAKET_LEN-1))
47
  {
48
    daten[bytecount] = byte;                  // Daten speichern
49
    checksum += byte;
50
    bytecount++;
51
  }
52
  else
53
  {
54
    rfm12_send_cmd(0xCA81);                   // set FIFO mode
55
    rfm12_send_cmd(0xCA83);                   // enable FIFO
56
57
    if (checksum == byte)                     // Checksumme ok?
58
    {
59
      sensor_nr = daten[0];
60
      if (sensor_nr == (uint8_t) ~(daten[1]))
61
      {
62
        sensor_nr = (sensor_nr - 1) & 0x0F;
63
        memcpy((void *) sensor[sensor_nr], (void const *) daten, PAKET_LEN);
64
      }
65
    }
66
    checksum = 0;
67
    bytecount = 0;
68
  }
Da ich noch etwas unerfahren in der Programmierung in C bin stellt sich 
für mich die Frage wie ich dieses Byte Array wieder in ein ASCII Zeichen 
Array umwandeln kann um dieses dann auf dem Bildschirm anzuzeigen

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
Noch kein Account? Hier anmelden.