Hi,
bevor ich hier wild drauflos schreibe möchte ich vorneweg sagen was mein
ziel ist:
ich möchte nämlich 2 verschiedene programme zu einem beliebigen
zeitpunkt auf den atmega schreiben ohne jedesmal sisyavr öffnen zu
müssen.
bsp:
das eine versetzt das myavrboard in den "standby - modus" und das andere
programm lässt zum beispiel eine LED leuchten.
mein ziel ist, das board ,auf kurzem wege, über den pc zu steuern:
das heißt um 3 uhr soll die LED auflecuhten für 2 min und den rest des
tages soll das gerät im standbymodus bleiben.
mit hilfe anderer programmiersprachen wäre das theoretisch kein problem.
da man aber ein usb gerät im windows nicht einfach so aktivieren und
deaktivieren kann,und ich mich mit TWI überhaupt nicht auskenne, suche
ich seit einer woche nach einer möglichkeit, den atmega mit einem
anderen programm zu brennen. also wenn ich auf "kompilieren" drücke,
wird ja der quelltext in die sprache des atmega übersetzt und dies wird
in einer datei gespeichert.
also im besten falle möchte ich das fertige programm per doppelklick(
auf eine exe) auf den atmega schreiben.
gibt es so etwas? und wenn nicht, würd ich gerne wissen wie das sisyavr
macht, um mir dann soetwas selber programmieren zu können.
ich bedanke mich für jede hilfe im voraus.
gruß
Jan flember wrote:
> das heißt um 3 uhr soll die LED auflecuhten für 2 min und den rest des> tages soll das gerät im standbymodus bleiben.
Und warum soll das der PC machen?
Du schreibst für den AVR ein Programm, welches um 3.00 die LED an und um
3.02 aus schaltet.
Peter
das war nur ein beispiel. im prinzip geht es darum, ein usb gerät, in
dem fall das mk2 board zu steuern.
ich habe gehört das das auch anders geht:
"Die bessere Lösung ist, beide Programmteile auf den ATmega8 zu bringen
und nur ein Kommando vom PC zu senden um die eine oder andere Funktion
auszulösen.
Dies ist auch sehr einfach möglich, da der mySmartUSB (auch auf myAVR
Board MK2/MK3 ) auch einen Datenmodus besitzt und so die UART des
ATmega8 mit einem virtuellen COM-Port im PC verbindet. So kannst du z.B.
vom PC ein "S" senden und der ATmega geht in Standby und ein "L" senden
um die LED anzuschalten."
nur weiß ich nicht wie das geht. hat jemand eine ahnung oder einen
ansatz bzw code?
gruß
das hat aber absolut nichts mit dem zu tun, was du im ersten Posting
beschrieben hast...
das ist ein einziges Programm, welches auf einen Interrupt vom UART
wartet und je nach empfangenen Zeichen eine andere Funktion
aufruft...und sowas dürfte sich sich in jedem µC-Tutorial finden...
>da man aber ein usb gerät im windows nicht einfach so aktivieren und>deaktivieren kann,und ich mich mit TWI überhaupt nicht auskenne, suche>ich seit einer woche nach einer möglichkeit, den atmega mit einem>anderen programm zu brennen.
Man kann sich auch von hinten durchs Auge in die Brust schiessen...
Wenn du die Aufgaben (die der Controller erfüllen soll) verständlich
formulierst, dann wird dir auch geholfen.
Niemand programmiert einen Controller alle 2 Minuten um (nein, ich habe
den obigen Text schon verstanden...).
da ich mich mit echtzeituhren nicht auskenne, versuche ich z.B. einen
Wecker zu programmieren, wobei der PC sozusagen die Uhr ist und dem
Board den Impuls zum "piepen" oder "leuchten" gibt.
wäre die uhr im board intergiert, wäre das ca so:
if uhrzeit == 7:30
{
LED lecuhtet
else
nix
}
wie gesagt: der pc soll über die eingabeaufforderung dem board
sagen:"leuchte" :)
gruß
Jan flember wrote:
> da ich mich mit echtzeituhren nicht auskenne, versuche ich z.B. einen> Wecker zu programmieren, wobei der PC sozusagen die Uhr ist und dem> Board den Impuls zum "piepen" oder "leuchten" gibt.>> wäre die uhr im board intergiert, wäre das ca so:> if uhrzeit == 7:30> {>> LED lecuhtet>> else>> nix>> }>> wie gesagt: der pc soll über die eingabeaufforderung dem board> sagen:"leuchte" :)>> gruß
also nochmal:
- Interrupt-Routine für RXD, in der das angekommene Zeichen gelesen
wird, und ein Flagg gesetzt wird
- in der Endlosschleife wird auf das Flagg geprüft und das Zeichen dann
ausgewertet und zB die LED angeschaltet...
Justus Skorps wrote:
> also nochmal:>> - Interrupt-Routine für RXD, in der das angekommene Zeichen gelesen> wird, und ein Flagg gesetzt wird>> - in der Endlosschleife wird auf das Flagg geprüft und das Zeichen dann> ausgewertet und zB die LED angeschaltet...
Das ist zwar prinzipiell die bessere Lösung, allerdings sollte der TO
bei seinem Vorwissen erst mal die konventionelle Lösung machen. Bis du
ihm ausgedeutscht hast, was Interrupts sind ....
@Jan
Du brauchst also 2 Programme
Eines welches am PC läuft und die Zeit abfragt.
Als Kommando schickt das Programm über die USB/UART zb ein 'L', wenn die
Lampen eingeschaltet werden sollen, ein 'P' wenn piepsen anbesagt ist
und ein 'Q' wenn alles wieder ausgeschaltet werden soll.
Am µC läuft dann ein Program, welches im Grunde nichts anderes macht als
1
while(1){// ewig abarbeiten
2
3
warteaufZeichenvomUART
4
5
if(Zeichen=='L')
6
schalteLampeein
7
8
if(Zeichen=='P')
9
schatlePiepserein
10
11
if(Zeichen=='Q')
12
schalteLampeundPiepseraus
13
14
}
Dir ist hoffentlich aber klar, dass das was du da machst, ziemlicher
Nonsense ist. Dein AtMega ist ein kleiner Computer. Für den ist es ein
leichtes selbst Buch über die Zeit zu führen und entspechend zu
schalten. Extra dafür einen PC mitlaufen zu lassen, nur damit sich der
um die Zeit kümmert ist ein klein wenig übers Ziel hinausgeschossen.
Sinn der Sache ist es immer, das dein Mega autonom arbeitet, ohne auf
die Hilfe eines PC angewiesen zu sein.
Jan flember wrote:
> wäre die uhr im board intergiert, wäre das ca so:
Eine Uhr in den MC zu programmieren ist eine typische Einsteigeraufgabe.
Mach es, Du lernst dabei viele Grundlagen, welche fürs MC-Programmieren
nötig sind.
Als Zeitbasis nimmt man einen Timer, der den CPU-Takt (Quarz!) zählt
Oft wird auch ein DCF77-Dekoder programmiert, um die Uhr automatisch zu
stellen.
Peter
Karl heinz Buchegger wrote:
>> Das ist zwar prinzipiell die bessere Lösung, allerdings sollte der TO> bei seinem Vorwissen erst mal die konventionelle Lösung machen. Bis du> ihm ausgedeutscht hast, was Interrupts sind ....>
schon klar, aber wenn man das Zeug eh erst lernen muss, dann sollte man
es doch gleich richtig machen...und schliesslich ist es hier im Tutorial
auch gut erklaert...
wie der pc ein 'L' schickt ist mir klar. was der prozessor macht ist mir
auch klar. es geht mir eigentlich nur noch um das "zeichen".
wie, bzw mit welchem befehl/code, empfängt der controller das signal vom
pc.
"
Code:
uart.config(9600,UDR);
und in der mainloop:
Code:
uint8_t cmd=uart.getChar();
if(cmd=='S')
{....dein standby-code...}
else if(cmd=='L')
{....dein led-code...}
Eingabeaufforderung in etwa so:
Code:
>mode com1: 9600,n,8,1>echo S>>com1
"
nur stimmt beim ersten code iwas nicht.
wäre toll wenn ihr mir dabei noch helfen könntet.
letztendlich werde ich wahrscheinlich sowieso das ganze was ihr
beschreibt lernen müssen^^
gruß
ich fuchtel grad ewig rum doch iwie will mir das nicht gelingen bei dem
Code:
uart.config(9600,UDR);
kommt:
cc:20: error: expected constructor, destructor, or type conversion
before '.' token
und deshalb ist 'uart' natürlich nicht deklariert.
kennt jemand den fehler?
danke
Wenn ich das richtig erkenne, benutzt du C++ anstelle von C. Anders kann
ich mir die Punkte nicht erklären. Benutzt du eine vordeffinierte klasse
oder was ist das?
Poste bitte mal das komplette Programm und ich würde dir wenn es C++ ist
empfehlen auf reines C zu wechseln.
Gruß ErgoProxy
Ja und?
Willst du das jetzt irgendwie mischen, oder was?
Wenn ich nach Sisy AVR google, dann kommt da immer, das da ein
C-Compiler mit im Paket ist. Von C++ ist da nirgends die Rede.
Ich werd das Gefühl nicht los, das du grade versuchst den 10-ten Schritt
vor dem ersten zu machen.
Und das was du da als C++ Code präsentierst, ist noch nicht mal
ansatzweise kompletter C++ Code.
Vielleicht wird irgendjemand anderer aus dem Code-Fetzen, die du da von
dir gibst, schlau. Ich werd es auf jeden Fall nicht.
Edit: Hab inzwischen einen Link gefunden, nachdem C++ tatsächlich
unterstützt wird.