Zeit via Taster eingeben und über USART (Bidirektional)

Gast #177089
Lesenswert?

Hallo zusammen. wer kann mir helfen. ich bin absolut neu im bereich
AVR-uC prorammieren. Also: Ich möchte über Port D Pins 0...4 (5 Bit)
eine Zeit einstellen, die ich dann zu meinen anderen uC als Hexzahl
senden möchte. Fürs senden und empfangen brauche ich den gleichen Pin,
deshalb muss ich für jede Vorgang Ein- und Ausgänge neu initialisieren.


void InitSendenZeit (void)
{
  DDRD |=0x3F; //Port d, pin 0..5 als eingang, mit pin 5 senden

  /* Usart initialisieren*/  //Wie geht das?

  if (bit_is_clear (PIND, PIND5))   // Der Taster ist gedrückt.
  {
   // Daten senden: etwa so??? //

   UBRRH = 0x1F;  // 5 Bit ????
   UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ1);

  } //if
}// funktion

Ich verwende uC Atmega8 und 2 Funkmodule mit TRX433 (diese benötigen 3
Bidirektionale Pins für die Kommunikation). Wenn jemand in der Lösung
auch ein bischen dokumentieren könnte, wäre ich sehr dankbar.
Also, wer kann helfen?
Gast #177090
Lesenswert?

Tach,

hab für den ollen TRX433 mal ein Interface geschrieben...ist im Anhang,
vielleicht nurz Dir das was. Mit USART kannst du auf keinen Fall den TRX
ansprechen, weil die Kommunikation zusätzlich über eine Handshake und
Clock Leitung abgewickelt wird...

Stefan
Angehängte Dateien:
Gast #177091
Lesenswert?

@ Stefan: erstmal besten Dank für den Interface für TRX433.

Ich möchte gerne erstmal für den Einstieg einen Byte senden und
empfangen, habe die dokus von trx433 mehrmals schon durchgelesen und
einige sachen bereits ausprobiert, natürlich als Anfänger mit Null
Erfolg. Kann mir bitte jemand verraten, die sowas schon etwas
realisiert haben, wie ich sowas machen kann. Villeicht ist es zu viel
verlangt, aber mit so einen kleinen C-Datei, womit man das realisieren
könnte, wäre ich sehr gut bedient. Des weitere  würde ich dann
versuchen selber zu realisieren. Ich möchte am Ende Ports überwachen
(insg. ca 10 Bits + 6 Bits für die Kennung der Trx433 untereinander).
DANKE.

Gruß Calik
Gast #177092
Lesenswert?

Tach,

bitte die Doku genau lesen, das gilt übrigens für ALLE Datenblätter, da
ist wirklich jedes Wort wichtig :-)
Einen Byte kann man nicht senden, wenn dann nur einen 8er Block oder
einen 16er Block.

Senden kannst du z.B. so:

  trxadr=dte_rx_buf[0];
  trxdata6=dte_rx_buf[0];
  trxdata5=dte_rx_buf[2];
  trxdata4=dte_rx_buf[3];
  trxdata3=dte_rx_buf[4];
  trxdata2=dte_rx_buf[5];
      trxdata1=dte_rx_buf[6];
  trxdata0=dte_rx_buf[7];
  trx_send();

Empfangen z.B. so:

trxadr=0;
  trxdata0=13;
  trx_send();
  trx_rcv();

  dte_tx_buf[0]=trxdata6;
  dte_tx_buf[1]=trxdata5;
  dte_tx_buf[2]=trxdata4;
  dte_tx_buf[3]=trxdata3;
  dte_tx_buf[4]=trxdata2;
  dte_tx_buf[5]=trxdata1;
  dte_tx_buf[6]=trxdata0;
  dte_tx_buf[7]=0;
  dte_tx_pointer=0;

Es ist geschickt wenn man die Data Leitung des TRX auf einen Interrupt
Eingang des avr legt, da der Data Pin High wird wenn der TRX Daten
empfangen hat. Dann muss man umgehend die Daten abholen, sonst verwirft
der TRX selbige nach einem Timeout.

Stefan
Gast #177095
Lesenswert?

Hallo, ich bins nochmal.

Ich habe ein ziemlich großes Projekt und bis vor ca. einen Monat keine
Erfahrung mit Microcontrollern etc. und programmieren mit C. Nun habe
ich mich mittlerweile einigermaßen in uC eigearbeitet. Mein großes
Problem ist immer noch mit der TRX433 Transreceiver.

Hat jemand vielleicht ein kleines C Datei, den er mir zukommen lassen
kann, wo z.B. so ein 8er-Block gesendet und empfangen wird.

Das wäre sehr nett. Danke.

Gruß an alle
Calik


@Stefan Seegel:

Sorry, ich werde dich nicht mehr direkt anschreiben, sondern alles nur
ins Forum posten, damit jeder was davon hat, wie du auch korrekt mir
geschrieben hast.
Gast #177096
Lesenswert?

Ok, dann schreib ichs hier nochmal für evtl andere Mitleser:

Alles was man braucht ist in der trx433 bibliothek weiter oben. Man
muss erst den "Datenpuffer" voll schreiben (Doku des TRX433 beachten)
und dann trx_send() aufrufen. So wird gesendet. Zu beachten ist das
keines der Bytes 0 sein darf (steht nicht in der Doku).

Empfangen siehe Doku: Wenn ein Impuls auf der DATA Leitung kommt muss
man man in der lib das kommando zum empfangen aufrufen, die Daten
stehen dann im Puffer. Ich wollte evtl die TRX Lib mal umschreiben dass
man an die beiden Funktionen einen Zeiger auf einen Puffer übergeben
kann, bin aber von den TRXen weggekommen, weil die nix taugen. Gibt da
inzwischen viel bessere für das 800MHz ISM Band, die direkt über die
serielle Schnittstelle angesteuert werden, die Dinger übertragen dann
1:1, kosten genau so viel, haben höhere Reichweite und sind einfacher
anzusprechen.

MfG
Stefan
Gast #177097
Lesenswert?

@ Stefan

>>Gibt da inzwischen viel bessere für das 800MHz ISM Band, die direkt
>>über die serielle Schnittstelle angesteuert werden, die Dinger
>>übertragen dann 1:1, kosten genau so viel, haben höhere Reichweite
>>und sind einfacher anzusprechen.

Wo kann man diese den kaufen, ich habe schon bei conrad, schuricht,
etc. recherchiert gehabt, bis ich auf die TRX gestoßen bin. Kannst du
mir was empfehlen? Danke.

mfg Cengiz
Gast #177098
Lesenswert?

Vorsicht mit 866 MHz, davon abgesehen daß es eben kein ISM-Band ist
(sondern ein SRD-Band), dort gelten teilweise drastische zeitliche
Limitierungen für den Betrieb.  Teilweise sind nur 0,1 % Einschaltzeit
zugelassen, um die gegenseitige Beeinflussung minimal zu halten.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren