mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR/ EIA-485 Hardwareseitig Problem oder Software / Pegel


Autor: Murphy Spider (student-f)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich sehe mal wieder den Wald vor lauter Bäumen nicht...

Also, ich bin schon erfolgreich bei der EIA-232. Einrichten etc unter 
AVRSTUDIO mit dem AVR-GCC funktioniert einwandfrei. Also sollte die 
Initialisierung schon mal bei der 485 auch passen.

Ich verwende derzeit als Prototypen Umgebung nen STK500 mit angematchten 
ADM485 von microe.com (bald auf fertiger platine alles komplett!).

Senden etc kann ich alles auf dem Oscar sehen. Invertierung klappt 
einwandfrei. Allerdings bin ich mir bei den Pegeln nicht mehr sicher. 
Ich habe mehrere Quellen mir dazu durchgelesen, aber jeder schreibt 
irgendwie was anders. Kann mir einer von euch sagen, welcher Pegel den 
anliegen sollte?

Dann habe ich ein weiteres Problem, wenn ich empfangen möchte. Sobald 
ich die Empfangsroutine verwende hängt der uC irgendwo im Nirvana rum 
und reagiert nicht mehr. Meine Vermutung: Es kommen keine Daten zurück.. 
Aber auch wenn dies so ist(wie ich es dem Oscar wohl entnehme!) sollte 
dann der uC-Daten-Puffer doch Datenmüll interpretieren. oder ?

Achso, verwende als Code den Standard angepaßten Code aus den 
Datenblätern. Somit nix selbstzusammengebrautes. Es geht ja erstmal um 
die Hardwareseitige Nutzung. Das Protokoll sei erstmal hinten 
angestellt.

Kann mir einer weiterhelfen. Schonmal besten Dank.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Schaltplan? Software?

Ralf

Autor: student-f (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

hups...da fehlte doch glatt der Anhang!
#include <avr/io.h>
#include <avr/interrupt.h>

#define UART_BAUD 9600UL
#define F_CPU 8000000UL
#define TESTO_1 0x01
#define TESTO_2 0x02
#define TESTO_3 0x03
#define TESTO_4 0x04
#define RESERVE 0x00
#define  BYTECOUNT 0x02


unsigned char Testo_Send(unsigned char Case,unsigned char Testo_X);
void set_SS_X(unsigned char bit);
void unset_SS_X(unsigned char bit);
void InitUART();
unsigned char ReceiveByte(void);
void TransmitByte(unsigned char data);




void main(void)
{
//set baudrate and enable RX & TX 
InitUART();


DDRC = 0xff;
PORTC = 0xff;

DDRE = 0x04;

EICRA = (1<<ISC01)|(1<<ISC11)|((1<<ISC31));
EIMSK = (1<<INT0)|(1<<INT1)|(1<<INT3);
sei();  
set_SS_X(2);

  while(1) 
       {
    // Warte auf Tasteneingabe, dann Aufruf der Funktion
         }
  
}

unsigned char Testo_Send(unsigned char Case,unsigned char Testo_X)
{
  unsigned char Data_send[10],Data_receive[25], i=0;
  unsigned int Checksum=0,Value=0;
// 1. Frame in String, dann string ausgeben über 485

  Data_send[9] =  RESERVE;
  //Data[8] =  Checksum;
  Data_send[7] =  Case;
  Data_send[6] =  'P';  // 0x50
  Data_send[5] =  BYTECOUNT;
  Data_send[4] =  0x01;
  Data_send[3] =  RESERVE;  // im Befehl = Reserve
  Data_send[2] =  RESERVE;
  Data_send[1] =  RESERVE;
  Data_send[0] =  Testo_X;

  for (i=0;i<8;i++)
    {
    Checksum +=  Data_send[i];
    }
  //Bildung ZweierKomplement
    Checksum = (unsigned char) (0xff ^ Checksum) + 0x01;
  
  Data_send[8] =  Checksum;   

  set_SS_X(2); // High

    for (i=0;i<10;i++)
    {
    TransmitByte(Data_send[i]);
    }

  Value = ReceiveByte();
// Do oder for für alle Daten folgt!
  //Value a) Temperature or b) Serial Number 
  return Value;//Data[8]; 


  
}



ISR (INT0_vect)
{
PORTC = ~Testo_Send( 'U', TESTO_1);
set_SS_X(2);

}

ISR (INT1_vect)
{
PORTC = ~Testo_Send( 'U', TESTO_2);
unset_SS_X(2);
}

ISR (INT3_vect)
{
PORTC = 0xBB;

PORTC = ~ReceiveByte();
}

//Funktion zum rücksetzen der SS als Portausgänge an PORTB an Stelle X auf High
// PORTB von PB0 - PB4 
void set_SS_X(unsigned char bit)
{
  PORTE |= 1<<bit;
}

//Funktion zum setzen der SS als Portausgänge an PORTB an Stelle X auf Low
// PORTB von PB0 - PB4 
void unset_SS_X(unsigned char bit)
{
  PORTE &= ~(1<<bit);
}

void InitUART()
{

UBRR0H = ((F_CPU / (8UL * UART_BAUD)) - 1 )>> 8;
UBRR0L = ((F_CPU / (8UL * UART_BAUD)) - 1);
UCSR0A = (1<<RXC0) | (1<<TXC0);
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);// Asynchron 8N1

}

// --- receive a byte
unsigned char ReceiveByte(void)
{
// polls on receive complete
while(!(UCSR0A & (1<<RXC0)));

return UDR0; //return data

}

// --- transmit a byte
void TransmitByte(unsigned char data)
{
//polls on data register empty,wann darf ich loslegen? 
while(!(UCSR0A & (1<<UDRE0))); 
UDR0 = data; //transmit data
}



Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du solltest das "SS_X"-Bit auch wieder löschen/zurücksetzen, wenn du 
fertig mit Senden bist.
Dazu musst du erst gucken, ob das UDR leer ist (UDRE), und dann das 
TXC-Flag überprüfen. Danach dann das RS485-Richtungsbit wieder löschen, 
damit der Empfang auch wirklich möglich ist.

Es dürfte schon diverse Beiträge zu dem Thema geben...

>Achso, verwende als Code den Standard angepaßten Code aus den
>Datenblätern. Somit nix selbstzusammengebrautes.

Selbstgebrautes schmeckt manchmal einfach besser als fertiggekauftes...

Autor: student-f (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

danke für die Tipps... Kann es leider erst am Montag morgen wieder 
testen :-( Hmm, zurückgesetzt ist es im wahren Code schon...

Melde mich, was passiert ist :-)

Danke für die Tipps.

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.