Serielle-Schnittstelle (Mikrocontroller auf C#)

Gast #1980781
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
#1980802
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.
Gast #1980829
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 ??
#1980841
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.
Persönliche Seite #1980858
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.
Gast #1980873
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
#1980983
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.
#1981014
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
Gast #1981093
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?
#1981129
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.
Gast #1981749
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.
#1982177
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

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