Hi,
ich will nur Befehle (High Signal) zum Input Pin´s des µC Schicken.
Später (viel Später) soll nur der Livestream von der Cam zum PC geschickt werden.
Interruptgesteuert... , muss mal nachlesen oder hast du ein Beispiel dazu?
Druckbare Version
Hi,
ich will nur Befehle (High Signal) zum Input Pin´s des µC Schicken.
Später (viel Später) soll nur der Livestream von der Cam zum PC geschickt werden.
Interruptgesteuert... , muss mal nachlesen oder hast du ein Beispiel dazu?
Ein Beispiel habe ich nicht bei der Hand, ich verwende sonst die Lib von Fleury
Sag mal, hast du icq? Dann könne wir gern gezielt/schnell miteinander komunizieren.
Lib von Fleury sagt mir jetzt nichts, wie ist die aufgebaut?
http://jump.to/fleury
Unter AVR GCC Librarys gibt es diese.
ICQ oder so was habe ich nicht.
Danke für diesem Link, aber mein englisch ist nicht so toll und verstehe daher nicht viel :-(
das Programm in uartlibrary ist ja groß...
Kannst du oder ein andere der sich mit UART auskennt mir es besser beschreiben, wie das so funktioniert oder einen kleine Beispiel dazu?
War mein code falsch oder bin ich auf den richtigen Weg?
Du bist grundsätzlich auf dem richtigen Weg, die while Schleife ist aber für senden.
So müsste der Code aussehen oder?:
Wie programmiere ich, dass z.B. "W" in ASCII ungewandelt wird und mir PB1 auf high stellt?Code:int main(void)
{
/* UART einstellungen */
UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE); // UART TX,RX einschalten
UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1
/* Output einstellen */
DDRB = (1<<PB1); /* Pin PB1 als Ausgang für Led */
/* Zeichen empfangen */
uint8_t Usart_Rx(void)
{
while (!(UCSRA & (1<<RXC))) // warten bis Zeichen verfuegbar
; /* Hier muss jetzt der Befehl rein wenn ich z.b. W drücke PB1 auf high */
return UDR; // Zeichen aus UDR an Aufrufer zurueckgeben
}
}
@SimLock
>So müsste der Code aussehen oder?:
NEIN
Anmerkung: main() ist genauso eine Funktion, wie auch Usart_Rx() - diese können nicht verschachtelt werden! Wobei so der "UART-Empfang" nicht funktioniert. Das Geht über Interrupt und füllt dann globalen Puffer. Da implementiert man auch Verhalten gegen Pufferüberlauf und (Übertragungs-)Fehlerkontrolle.
> dass z.B. "W" in ASCII ungewandelt wird
char x = 'W';
PB1 = "high"; // diese Zeile ist ein Joke!
[PortB |= (1 << 0x01); heißt es richtig - nur verstehst Du auch, was hier passiert, warum ein |-Operator benutzt wird, was der '<<'-Operator bewirkt - das sind Grundlagen!]
> Wie programmiere ich,
Kleiner Tipp, frag Dr. Google - "C für Anfänger" wäre so ein Suchkriterium.
Sorry, meine Meinung ist, Du kannst hier im Forum gerne fragen bei Problemen, aber die Grundzüge von C kannst Du besser aus Büchern lernen.
Und irgendwelche Libs zu nehmen, wenn man von den Grundzügen keine Ahnung hat, ist der falsche Weg - das macht dann Dir auf Dauer keinen Spaß.
Kleiner Tipp, schau die Codeschnippsel im Netz an, wie es andere gelöst haben, daraus kann man auch gut lernen.
Danke für dein Tip!
Das mit der Funktion () verstehe ich.
Ich habe mich beim Markieren, einfügen verklickt.
Frage zu deinen Code:
PortB |= (1 << 0x01);
Der Code was ich geschrieben habe, macht doch die gleiche funktion:
DDRB = (1<<PB1);
Ich bin ja grade erst paar Tage hierbei und lerne fleißig :-)
Ich habe mal schnell was zusammengeschrieben. Die Timerwerte und OCRx-Werte mussst du für dich anpassen. Es geht mit den Zahlen am Tastenblock 2,4,6,8,0.
Ein gutes C-Tutorial ist auch das hier: http://www.mikrocontroller.net/artic...R-GCC-TutorialCode:#include <avr/io.h>
#include <stdbool.h>
#include <stdlib.h>
#include <avr/io.h>
#include <AVR/iom8.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#define F_CPU 8000000 // clock
#define BAUD 9600
#define bauddivider (unsigned int)(F_CPU / BAUD / 16 - 0.5)
volatile unsigned char rxwert=0x30;
ISR(USART_RXC_vect){
rxwert= UDR;
PORTB=(1<<PB0);
}
void timer1_init(void)
{
TCCR1A = (1<<WGM11)|(1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0); // initalize mega8 Timer1 with 9Bit, inverted, Prescaler 256
TCCR1B = (1<<CS12); // this gives us a signal with 21.76ms at 12MHz
OCR1A = 486; // pulse of 1.5ms 512- 1500*(F_CPU/256/1000000)/2
OCR1B = 486;
}
void usart_init(void){
UBRRL = bauddivider; //set baud rate
UBRRH = bauddivider >> 8;
UCSRB = (1<<RXCIE)|(1<<RXEN);
UCSRC = (1<<URSEL)|(3<<UCSZ0);
}
int main (void)
{
timer1_init();
usart_init();
DDRB = (1<<PB0)|(1<<PB1)|(1<<PB2); /* Pin PB1 2 als Ausgang für Servo */
DDRD &= (~ (1<<PD2)|(1<<PD3)|(1<<PD0)|(1<<PD1)); /* Pin D als Eingang */
PORTD |= (1<<PD2)|(1<<PD3)|(1<<PD0)|(1<<PD1); /* Pull Up aktivieren */
sei();
while(1){
if(rxwert==0x30){
if (!( PIND & (1<<PIND2))) /* mache was wenn PinD2 low ist */
{
OCR1A=470;
}
if (!( PIND & (1<<PIND3))) /* mache was wenn PinD3 low ist */
{
OCR1A=499;
}
if (( PIND & (1<<PIND2))&&(PIND & (1<<PIND3))) { /* Mitte wenn keine Taste */
OCR1A = 486;
}
if (!( PIND & (1<<PIND0))) /* mache was wenn PinD0 low ist */
{
OCR1B=470;
}
if (!( PIND & (1<<PIND1))) /* mache was wenn PinD1 low ist */
{
OCR1B=499;
}
if (( PIND & (1<<PIND0))&&(PIND & (1<<PIND1))) { /* Mitte wenn keine Taste */
OCR1B=486;
}
}
switch(rxwert){
case 0x38 :
OCR1A=470;
break;
case 0x32 :
OCR1A=499;
break;
case 0x34 :
OCR1B=470;
break;
case 0x36 :
OCR1B=499;
break;
}
}
}
Hubert