Forum: HF, Funk und Felder RFM12 mit AT89C4051


von C.Polo (Gast)


Lesenswert?

Hallo
Ich wollte bei meinem Projekt das RFM12 Module mit einem AT89C4051 
ansteuern. Finde aber nur Programme/Hilfe für AVR controller. Da ich AVR 
überhaupt nicht kenne, find ich mich nicht so zurecht wie ich die 
Programme von AVR auf meinen Controller "übersetzen" kann. (Ich 
programmiere in C)

Gibt es da jemand der mir helfen könnte?

schonmal danke im vorraus

von C.Polo (Gast)


Lesenswert?

Was mir vorallem zu denken gibt, wofür werden diese 3 Anschlüsse im 
Programm verwendet. Das Beispielprogramm habe ich von diesem Forum.

#define RF_PORT  PORTB
#define RF_DDR  DDRB
#define RF_PIN  PINB

Was ich bis jetzt weis ist: PORTB ist halt ein normaler Port, mit DDRB 
sagt man welche Pins beim PORTB Ausgänge oder Eingänge sind. PINB weis 
ich nicht, aber nach dem Name würde ich sagen es ist ein Pin von PORTB?

Und wofür ist cbi und sbi?

Diese werden glaub ich nur in diesen Teilen des Programms verwendet.
1
unsigned short rf12_trans(unsigned short wert)
2
{  unsigned short werti=0;
3
  unsigned char i;
4
5
  cbi(RF_PORT, CS);
6
  for (i=0; i<16; i++)
7
  {  if (wert&32768)
8
      sbi(RF_PORT, SDI);
9
    else
10
      cbi(RF_PORT, SDI);
11
    werti<<=1;
12
    if (RF_PIN&(1<<SDO))
13
      werti|=1;
14
    sbi(RF_PORT, SCK);
15
    wert<<=1;
16
    _delay_us(0.3);
17
    cbi(RF_PORT, SCK);
18
  }
19
  sbi(RF_PORT, CS);
20
  return werti;
21
}
1
void rf12_ready(void)
2
{  cbi(RF_PORT, CS);
3
  while (!(RF_PIN&(1<<SDO))); // wait until FIFO ready
4
}
1
void rf12_init(void)
2
{
3
  RF_DDR=(1<<SDI)|(1<<SCK)|(1<<CS);
4
  RF_PORT=(1<<CS);
5
6
  for (unsigned char i=0; i<10; i++)
7
    _delay_ms(10);      // wait until POR done
8
9
  rf12_trans(0xC0E0);      // AVR CLK: 10MHz
10
  rf12_trans(0x80D7);      // Enable FIFO
11
  rf12_trans(0xC2AB);      // Data Filter: internal
12
  rf12_trans(0xCA81);      // Set FIFO mode
13
  rf12_trans(0xE000);      // disable wakeuptimer
14
  rf12_trans(0xC800);      // disable low duty cycle
15
  rf12_trans(0xC4F7);      // AFC settings: autotuning: -10kHz...+7,5kHz
16
}

von JL (Gast)


Lesenswert?

Falls du schon länger du in C programmierst sollte dir klar sein das cbi 
bzw sbi eine Funktion oder ein Makro ist. Wahrscheinlich ein Macro. Also 
im Beispielcode mal danach suchen.

Desweiteren sind die Namen eigentlich fast eindeutig:
 CBI: clear bit from given parameter (RF_PORT -> PORT B, SCK -> 
spezielles bitposition für Clockanschluss)
 SBI: set bit ....



JL

von C.Polo (Gast)


Lesenswert?

Die Name sind schon klar, jedoch wie genau die Ports bei AVR 
funktionieren wusste ich nicht(hast mich wohl falsch verstanden, oder 
ich mich falsch ausgedrückt :P). Habe aber eine sehr hilfreiche Doku 
gefunden(nach ewigem googeln):

http://www.tschallener.net/AVR/AVR-Ports.pdf

Ich programmiere zwar seit ca. 2 Jahre, aber dafür nicht so häufig. Und 
cbi und sbi habe ich bis jetzt noch nie gebraucht.

naja das meiste ist mir jetzt eigentlich klar. Werd dann beim nächsten 
Problem wieder hier posten.

mfg

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.