Forum: Mikrocontroller und Digitale Elektronik Serielle-Schnittstelle (Mikrocontroller auf C#)


von Richi (Gast)


Lesenswert?

Hallo alle mit einander,

zurzeit programmiere ich die Serielle Schnittstelle des 
Mikrocontrollers,
versuche eine Übertragung von einem analogen Wert

das ist das Programm von Mikrocontrollers:


#include <avr/io.h>           //Aus und Eingänge Bibliothek
#include <avr/interrupt.h>    //Interrupt freischalten
#include <stdio.h>        //Zeichen freischalten
#include <util/delay.h>      // verzögeruns Bibliothek aufrufen
#include <sps_lcd.h>      //lcd Bibliothek Pinbelegung
#include "sps_lcd.c"

#include "v24_poll.c"


unsigned char _analog;
char _lcd_buffer[20];

ISR(INT0_vect)
{
  PORTB|=(1<<2);
}

ISR(INT1_vect)
{
  PORTB&=~(1<<2);
}

void initAD()
{

  ADMUX|=(1<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0 
<<MUX1)|(0<<MUX0);
  /*
  ADMUX Zentraler Register,
  REFS1, REFS0 legen die Referenzspannung fest,
  ADLEAR wird bei starken Signalschwankungen und Rauschen verwendet für 
8 Bit Ergebnisse,
  MUX4...0 wird für Eingänge-Verschaltung benötigt
  */

  ADCSRA|=(1<<ADEN)|(1<<ADSC)|(0<<ADATE)|(0<<ADIF)|(0<<ADIE)|(1<<ADPS2)|(1 
<<ADPS1)|(1<<ADPS0);
  /*
  ADCSRA ist ein Wandlungsvorgang Register,
  ADEN Analog/Digital Wandler freigeben,
  ADSC Wandler starten
  ADPS2..0 Wandlungstakt (001 – F_CPU/2, 010 - / 4, 011 – 8, ... 111 - 
F_CPU/128)
  */
}

void initv24 (void)
  {

    //UCSRC = 0b10000110;
    //UCSRB |= ((1 << TXCIE) | (0 << RXCIE));

  }

void initlcd(void)
{
  DDRD = 0xf0; // 11110000 Datenrichtigungsregister die ersten sind 
ausgänge
  PORTD =0x0f; // 00000000

  lcd_init(LCD_DISP_ON);
  lcd_clrscr();
  lcd_gotoxy(0,0);
  sprintf(_lcd_buffer,"%1d",_analog);
  lcd_puts(_lcd_buffer);
}

int main ()
{
  MCUCR|= (1<<ISC00)|(1<<ISC01)|(1<<ISC10)|(1<<ISC11);// bei steignder 
Flanke aktevieren

    DDRA=0x00;
    PORTA=0b11111110;
    DDRB=0xff;
    PORTB=0xff;
  v24_init(9600);

  while (1)
  {
    initlcd();
    initAD();
    _analog=ADCH; // PINA0 zugewiesen zu _analog Variable.
    initv24();
    if(_analog<=0)
    {
      PORTB&=~(1<<1);
      GICR|=(1<<INT1);
      sei();
      PORTB|=(1<<7);
    }
    else if(_analog>=50)
    {
      PORTB|=(1<<1);
      PORTB&=~(1<<7);
      GICR|=(1<<INT0);
    }
    else if((_analog>2)|(_analog<49))
    {
      PORTB|=(1<<1);
      PORTB|=(1<<7);
    }
    v24_putc(_analog);
  }
}


und das ist das Programm von C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private void checkBox1_CheckedChanged(object sender, EventArgs 
e)
        {
            if (checkBox1.Checked == true)
            {
                serialPort1.Open();
            }
            else
            {
                serialPort1.Close();
            }
        }
            byte[] _analog = new byte[1];
        private void checkBox2_CheckedChanged(object sender, EventArgs 
e)
        {
            if (checkBox2.Checked == true)
            {
                ;
            }
            else
            {
                ;
            }

        }
        private void serialPort1_DataReceived(object sender, 
System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            serialPort1.Read(_analog, 0, 1);
        }

        private void progressBar1_Click(object sender, EventArgs e)
        {
            progressBar1 = _analog;
        }

    }
}



aus irgend einem Grund funktioniert die Kommunikation nicht

von Klaus W. (mfgkw)


Lesenswert?

Das macht irgendwie keinen Spaß zu lesen (Formatierung,
Schreibweise, hartverdrahtete Bitwerte statt sinnvoller Namen...).
Und die Fehlerbeschreibung ist fast eine Beleidigung ("funktioniert
nicht").

Deshalb nur der allgemeine Rat: Grenze doch das Problem ein und
probiere erst mit einem Terminalprogramm etc., ob der MC etwas
sendet und empfängt.
Erst dann lohnt es sich, die Gegenseite anzuschauen.

Evtl. auch mal über volatile nachdenken.

von Michael H. (michael_h45)


Lesenswert?


von Klaus W. (mfgkw)


Lesenswert?

Und bitte nicht den gleichen unlesbaren Misthaufen auch noch in mehreren 
Threads aufmachen.
Beitrag "V24 Schnittstelle"

Sind wir hier die Deppen vom Dienst?

von Klaus W. (mfgkw)


Lesenswert?

PS: Es gibt auch ein Tutorial zu RS232 hier.

von Richi (Gast)


Lesenswert?

Man braucht für eine Serielleübertragung

Mikrocontrollerseitig:

die Bibliothek #include                      "v24_poll.c"
Variable in Char                             char _analog;
den Befehl um die Baudrate einzustellen      v24_init(9600);
den Befehl um die Variable zu versenden      V24_putc(_analog);

c# seitig:

serialPort1.Open();
serialPort1.Read(_analog, 0, 1);

das müsste doch für die minimale Übertragung reichen ??

von Michael H. (michael_h45)


Lesenswert?

Klaus Wachtler schrieb:
> Sind wir hier die Deppen vom Dienst?
Nach seiner letzten Antwort stehts wohl fest =)

von Klaus W. (mfgkw)


Lesenswert?

Michael H. schrieb:
> Nach seiner letzten Antwort stehts wohl fest =)

Stimmt, aber was gibt es da zu grinsen?

von Richi (Gast)


Lesenswert?

mit welchen Recht behauptest Du meine Meinung??

Ich halte keinen hier für einen Deppen.

von Klaus W. (mfgkw)


Lesenswert?

Richi schrieb:
> mit welchen Recht behauptest Du meine Meinung??

Ich behaupte nur meine, nicht deine.

von Michael H. (michael_h45)


Lesenswert?

Klaus Wachtler schrieb:
> Stimmt, aber was gibt es da zu grinsen?
Zu viel ärgern gibt nur Falten. Hm, zu viel Grisen auch...
Ach dann liegts einfach am schönen Wetter.

Und bevor der Richi sich denkt, hier seien nur Trolle unterwegs: Mein 
lieber Mann, wie man in den Wald ruft...
Daher nochmal Netiquette: Klare Beschreibung des Problems
Vor allem die letzten beiden Punkte.

von Klaus W. (mfgkw)


Lesenswert?

Michael H. schrieb:
> Und bevor der Richi sich denkt, hier seien nur Trolle unterwegs:

Hm, wenn meinst du jetzt? Hier sind bsiher drei Leute unterwegs:
der TE, Du und ich.
Ihn meinst du offenbar nicht, dich vermutlich auch nicht.
Mist.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Richi schrieb:

> das müsste doch für die minimale Übertragung reichen ??

Radio Eriwan: Im Prinzip ja. Wenn verschiedene Kleinigkeiten 
gleichzeitig erfüllt sind. Die da wären...

1. Korrekte Programmierung der µC-seitigen Funktionen v24_init und 
v24_putc.

2. Korrekte Hardware µC-seitig, also im wesentlichen Taktrate, 
Pegelwandler, Buchse, Kabel zum PC.

3. Korrekte Programmierung PC-seitig, also im wesentlichen die 
Vorbelegung der Werte, die von Open benutzt werden. Minimal PortName und 
BaudRate. Statt Read ist bei Länge 1 Readbyte vielleicht logischer. 
Read/Readbyte können nur funktionieren, wenn das Open erfolgreich war. 
Der Rückgabewert von Open sollte also ausgewertet werden.

1. und 2. können und sollten unabhängig von 3. geprüft werden. Denn ohne 
fehlerfreies 1. und 2. kann 3. nicht funktionieren. Wie geprüft werden 
kann, hat Klaus bereits geschrieben.

von Michael H. (michael_h45)


Lesenswert?

Klaus Wachtler schrieb:
> Ihn meinst du offenbar nicht, dich vermutlich auch nicht.
> Mist.
Hehe, eigentlich meinte ich mich schon (auch).

von Pfeiffy (Gast)


Lesenswert?

Hallo,
ich denke es geht hier mehr um Eitelkeiten, als um die Sache.. sollte 
eigentlich nicht so sein. Für meine erste Schaltung hatte ich 3 Monate 
gebraucht, doch jetzt gehts.
wenn du es garnicht hinbekommst, kann ich die was zusenden: ich habe 
einen analogen Wert (ADC)-Wert vom mc nach PC übertragen, die habe ich 
allerdings mit assembler und Java am PC geschrieben, auf einem Atmega8, 
wenn dir das hilft?

Gruß
Pfeiffy

von Peter D. (peda)


Lesenswert?

Richi schrieb:
> Man braucht für eine Serielleübertragung
>
> Mikrocontrollerseitig:
>
> die Bibliothek #include                      "v24_poll.c"
> Variable in Char                             char _analog;
> den Befehl um die Baudrate einzustellen      v24_init(9600);
> den Befehl um die Variable zu versenden      V24_putc(_analog);
>
> c# seitig:
>
> serialPort1.Open();
> serialPort1.Read(_analog, 0, 1);
>
> das müsste doch für die minimale Übertragung reichen ??

Woher soll das jemand wissen außer Dir?
Wir kennen Deine "v24_poll.c" doch nicht.

Tue einfach mal so, als ob alle hier nicht auf Deine Testplatine und 
Deine PC-Festplatte gucken könnten.


Peter

P.S.:
Gibs zu, Du willst doch gar keine Antwort auf Deine Frage. Du willst 
einfach nur wissen, ob bei Dir ein Lauschangriff läuft.
Wenn also jemand ohne Informationen antworten kann, dann ist das der 
Fall.

von Richi (Gast)


Lesenswert?

Ich wollte mich für eure Beiträge bedanken !!!

von Michael H. (michael_h45)


Lesenswert?

Michael H. schrieb:
> wie man in den Wald ruft...

von Peter D. (peda)


Lesenswert?

Richi schrieb:
> void initv24 (void)
>   {
>
>     //UCSRC = 0b10000110;
>     //UCSRB |= ((1 << TXCIE) | (0 << RXCIE));
>
>   }

Ich grübele schon seit Stunden, wozu diese Funktion gut ist.
Es muß doch einen Grund haben, warum Du meinst, sie uns unbedingt zeigen 
zu müssen.

Oder willst Du einfach nur durch überflüssigen Text das Erkennen des 
Fehlers absichtlich erschweren?


Peter

von Klaus W. (mfgkw)


Lesenswert?

Peter Dannegger schrieb:
> Ich grübele schon seit Stunden, wozu diese Funktion gut ist.

Selbst schuld! :-)

von Klaus W. (mfgkw)


Lesenswert?

Peter Dannegger schrieb:
> Gibs zu, Du willst doch gar keine Antwort auf Deine Frage. Du willst
> einfach nur wissen, ob bei Dir ein Lauschangriff läuft.
> Wenn also jemand ohne Informationen antworten kann, dann ist das der
> Fall.

Wie die beiden Hellseher, die sich auf der Straße treffen:
"Dir geht's gut, und wie geht's mir?"

von Pfeiffy (Gast)


Lesenswert?

Oh je! nu iss aber gut, ich denke das Problem ist ganz klar definiert, 
die Kommunikation geht nicht, als Anfänger weiss man hier nicht, wo das 
Problem liegt und kann es so auch nicht beschreiben.

Frage: so wie ich das sehe, willst du nicht auf en PC, sondern auf ein 
LCD schreiben?

von Michael H. (michael_h45)


Lesenswert?

Pfeiffy schrieb:
> Oh je! nu iss aber gut, ich denke das Problem ist ganz klar definiert,
Totaler Blödsinn!
Hier ist rein gar nichts klar definiert.
Oder siehst du eine Initialisierung der UART? Siehst du eine 
Hardwarebeschreibung? Siehst du auch nur eine Zeile zum Versuchaufbau?

> die Kommunikation geht nicht, als Anfänger weiss man hier nicht, wo das
Das ist billige und ungleich dumme Ausrede!
Ein denkender Mensch muss dazu in der Lage sein, ein Problem anderen 
verständlich machen zu können.

Wenn ein 5-jähriger hinfällt, muss er der Mama auch sagen können, wo es 
wehtut.

Eine stumpfe "geht nicht"-Zeile ist keine Problembeschreibung.
Hier sind einfach nur Codebatzen ohne nachzudenken hingeworfen worden 
mit folgendem offensichtlichen Gedanken im Hinterkopf: Ich bin zu faul, 
da jetzt wirklich drüber nachzudenken, sollen das mal andre machen.

von Pfeiffy (Gast)


Lesenswert?

tut mir leid, ich möchte mich hier nicht über die Sinnhaftigkeit einer 
Aussage unterhalten, 22 Beiträge nur darüber wie jemand eine Frage 
stellt? Ich denke so könnt Ihr hier niemandem helfen, sondern nur 
erschrecken.
Oft weiss man als Anfänger nichtmal die Frage.

von Peter D. (peda)


Lesenswert?

Pfeiffy schrieb:
> Oft weiss man als Anfänger nichtmal die Frage.

Und genau deshalb gibt es Postingregeln, Netiquette usw., die einen an 
die Hand nehmen, welche wichtigen Informationen man geben sollte.

Es gibt daher nur ein wirkliches Problem für den Anfänger: man muß sie 
lesen.


Wenn ich eine C-Frage stelle, ist es doch wohl selbstverständlich, daß 
ich zuerst den genauen MC-Typ und den Compiler angebe.

Und wenn ich eine nicht-Standard-Lib benutze, gehört die 
selbstverständlich mit als Anhang dazu. Keiner kann schließlich auf 
Deine Festplatte gucken.

Der Leser sollte alle notwendigen Informationen kriegen, damit der 
gepostete Code ohne Fehler und Warnungen compilierbar ist.
Eine große Unsitte ist daher auch, Variablen ohne Typvereinbarung zu 
benutzen.


Peter

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.