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