Staind
06.07.2011, 18:21
Hallo,
ich habe ein Problem. Ich habe ein C# Programm geschrieben mit den ich daten über den Com Port schicken kann. Mein uC soll diese nun empfangen. Sobald Daten empfangen werden, soll die LED am Port-D leuchten.
Vorher aber erstmal die 2 programme.
einmal mein uC Programm (Kommt aus den AVR Tutorial von www.mikrocontroller.net, also wird es wohl nicht daran liegen):
.include "m8def.inc"
.def temp = R16
.equ F_CPU = 3686400 ; Systemtakt in Hz
.equ BAUD = 9600 ; Baudrate
; Berechnungen
.equ UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1) ; clever runden
.equ BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1))) ; Reale Baudrate
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000) ; Fehler in Promille
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10)) ; max. +/-10 Promille Fehler
.error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
.endif
; Stackpointer initialisieren
ldi temp, HIGH(RAMEND)
out SPH, temp
ldi temp, LOW(RAMEND)
out SPL, temp
; Port D = Ausgang
ldi temp, 0xFF
out DDRD, temp
; Baudrate einstellen
ldi temp, HIGH(UBRR_VAL)
out UBRRH, temp
ldi temp, LOW(UBRR_VAL)
out UBRRL, temp
; Frame-Format: 8 Bit
ldi temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
out UCSRC, temp
sbi UCSRB, RXEN ; RX (Empfang) aktivieren
receive_loop:
sbis UCSRA, RXC ; warten bis ein Byte angekommen ist
rjmp receive_loop
in temp, UDR ; empfangenes Byte nach temp kopieren
out PORTD, temp ; und an Port D ausgeben.
rjmp receive_loop ; zurück zum Hauptprogramm
und mein C# programm
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;
using System.IO.Ports; //Einfügen
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
SerialPort AktuellerComPort = new SerialPort ("COM3",9600,Parity.None, 8,StopBits.One); // ComCort erzeugen
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string[] schnittstellen = SerialPort.GetPortNames(); // Gibt alle aktuell verfügbaren Comports zurück
foreach (string comport in schnittstellen)
{comboBox1.Items.Add(comport); }
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
AktuellerComPort.PortName = comboBox1.Text; // dem ComPort Objekt einen Comport zuweisen
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void button2_Click(object sender, EventArgs e)
{
try
{
AktuellerComPort.Open();
AktuellerComPort.Write(textBox1.Text); // sende inhalt der Textbox an ComPort
AktuellerComPort.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void button3_Click(object sender, EventArgs e)
{
try
{
AktuellerComPort.ReadTimeout = 300; //Wartezeit (Timeout Zeit) (in ms) auf Antwort bevor der Lesevorgang abgebrochen wird
AktuellerComPort.Open();
textBox2.Text = AktuellerComPort.ReadLine(); //einlesen
AktuellerComPort.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
AktuellerComPort.Close();
}
}
}
}
hier noch die Form dazu
http://img804.imageshack.us/img804/4489/form1v.jpg
dabei ist der Button "Daten Senden" Button2 und links daneben die Textbox1
So als Programmer habe ich den myAVR mySmartUSB MK2 bzw habe das kommplette uC Board. Hier ein Bild vom Programmer:
http://img233.imageshack.us/img233/6475/mysmartusbg.png
Ausgangssituration: Programm auf uC und das uC Board am PC via USB angeschlossen. Rote LED vom Programmer leuchtet
Wenn ich jetzt das myAVRControlcenter benutze (hier ein Bild)
http://img13.imageshack.us/img13/7053/programmw.jpg
und die Verbindung herstelle (Start Button oben rechts) dann geht die rote Led von den Programmer aus und die 2 grünen Leds an.
Gebe ich dann im myAVR Controllcenter unter Daten Senden was ein und klicke Senden werden die Daten übertragen (grüne LEDs blinken) und der D Port vom uC wird gesetzt. -> Die Led Leuchtet (Port D PIN2 ist mit einer Led verbunden)
Wenn ich das ganze über mein C# Programm probiere, geht die rote LED vom Programmer nicht aus. Gebe ich in der Textbox was ein und klicke den Butten "Daten Senden" leuchten zwar die beiden grünen LEDs vom Programmer kurz auf (also es wird wohl etwas übertragen), aber der uC bzw das Programm macht nichts. Also die LED am D Port leuchtet nicht.
Wie kann ich das Problem lösen?
Wäre super wenn einer eine Lösung weiß
Schonmal vielen Dank für die Antworten!
mfg André
ich habe ein Problem. Ich habe ein C# Programm geschrieben mit den ich daten über den Com Port schicken kann. Mein uC soll diese nun empfangen. Sobald Daten empfangen werden, soll die LED am Port-D leuchten.
Vorher aber erstmal die 2 programme.
einmal mein uC Programm (Kommt aus den AVR Tutorial von www.mikrocontroller.net, also wird es wohl nicht daran liegen):
.include "m8def.inc"
.def temp = R16
.equ F_CPU = 3686400 ; Systemtakt in Hz
.equ BAUD = 9600 ; Baudrate
; Berechnungen
.equ UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1) ; clever runden
.equ BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1))) ; Reale Baudrate
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000) ; Fehler in Promille
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10)) ; max. +/-10 Promille Fehler
.error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
.endif
; Stackpointer initialisieren
ldi temp, HIGH(RAMEND)
out SPH, temp
ldi temp, LOW(RAMEND)
out SPL, temp
; Port D = Ausgang
ldi temp, 0xFF
out DDRD, temp
; Baudrate einstellen
ldi temp, HIGH(UBRR_VAL)
out UBRRH, temp
ldi temp, LOW(UBRR_VAL)
out UBRRL, temp
; Frame-Format: 8 Bit
ldi temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
out UCSRC, temp
sbi UCSRB, RXEN ; RX (Empfang) aktivieren
receive_loop:
sbis UCSRA, RXC ; warten bis ein Byte angekommen ist
rjmp receive_loop
in temp, UDR ; empfangenes Byte nach temp kopieren
out PORTD, temp ; und an Port D ausgeben.
rjmp receive_loop ; zurück zum Hauptprogramm
und mein C# programm
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;
using System.IO.Ports; //Einfügen
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
SerialPort AktuellerComPort = new SerialPort ("COM3",9600,Parity.None, 8,StopBits.One); // ComCort erzeugen
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string[] schnittstellen = SerialPort.GetPortNames(); // Gibt alle aktuell verfügbaren Comports zurück
foreach (string comport in schnittstellen)
{comboBox1.Items.Add(comport); }
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
AktuellerComPort.PortName = comboBox1.Text; // dem ComPort Objekt einen Comport zuweisen
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void button2_Click(object sender, EventArgs e)
{
try
{
AktuellerComPort.Open();
AktuellerComPort.Write(textBox1.Text); // sende inhalt der Textbox an ComPort
AktuellerComPort.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void button3_Click(object sender, EventArgs e)
{
try
{
AktuellerComPort.ReadTimeout = 300; //Wartezeit (Timeout Zeit) (in ms) auf Antwort bevor der Lesevorgang abgebrochen wird
AktuellerComPort.Open();
textBox2.Text = AktuellerComPort.ReadLine(); //einlesen
AktuellerComPort.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
AktuellerComPort.Close();
}
}
}
}
hier noch die Form dazu
http://img804.imageshack.us/img804/4489/form1v.jpg
dabei ist der Button "Daten Senden" Button2 und links daneben die Textbox1
So als Programmer habe ich den myAVR mySmartUSB MK2 bzw habe das kommplette uC Board. Hier ein Bild vom Programmer:
http://img233.imageshack.us/img233/6475/mysmartusbg.png
Ausgangssituration: Programm auf uC und das uC Board am PC via USB angeschlossen. Rote LED vom Programmer leuchtet
Wenn ich jetzt das myAVRControlcenter benutze (hier ein Bild)
http://img13.imageshack.us/img13/7053/programmw.jpg
und die Verbindung herstelle (Start Button oben rechts) dann geht die rote Led von den Programmer aus und die 2 grünen Leds an.
Gebe ich dann im myAVR Controllcenter unter Daten Senden was ein und klicke Senden werden die Daten übertragen (grüne LEDs blinken) und der D Port vom uC wird gesetzt. -> Die Led Leuchtet (Port D PIN2 ist mit einer Led verbunden)
Wenn ich das ganze über mein C# Programm probiere, geht die rote LED vom Programmer nicht aus. Gebe ich in der Textbox was ein und klicke den Butten "Daten Senden" leuchten zwar die beiden grünen LEDs vom Programmer kurz auf (also es wird wohl etwas übertragen), aber der uC bzw das Programm macht nichts. Also die LED am D Port leuchtet nicht.
Wie kann ich das Problem lösen?
Wäre super wenn einer eine Lösung weiß
Schonmal vielen Dank für die Antworten!
mfg André