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 | warte auf Zeichen vom UART |
4 | |
5 | if( Zeichen == 'L' ) |
6 | schalte Lampe ein |
7 | |
8 | if( Zeichen == 'P' ) |
9 | schatle Piepser ein |
10 | |
11 | if( Zeichen == 'Q' ) |
12 | schalte Lampe und Piepser aus |
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
zum einen habe ich einen asm code und dann noch den c++ code, allerdings fehlt mir da die programmvorlage für UART: asm code: ; Start, Power ON, Reset main: ldi r16, hi8(RAMEND) out SPH, r16 ldi r16, lo8(RAMEND) ; Stack Initialisierung out SPL, r16 ; Init Stackpointer sbi UCSRB, 3 ; USR=UCSRB=0x0A TXEN=Bit3 TX aktivieren ldi r16, 3686400/(9600*16)-1 ;Baudrate 9600 einstellen out UBRRL, r16 mainloop: ldi r16, 'T' rcall putChar ldi r16, 'e' rcall putChar ldi r16, 's' rcall putChar ldi r16, 't' rcall putChar ldi r16, '!' rcall putChar ldi r16, 10 rcall putChar ldi r16, 13 rcall putChar ldi r16, 4 rcall putChar rcall wait rjmp mainloop ;----------------------------------------------------------------------- ------- putChar: sbis UCSRA, 5 ; USR=UCSRA=0x0B UDRE=Bit5 rjmp putChar ; warten, bis UDR bereit out UDR, r16 ret ; zurück zum Hauptprogramm ;----------------------------------------------------------------------- ------- wait: push r24 push r25 ldi r25, 0x02 loop1: ldi r24, 0xFF loop2: subi r24, 0x01 brcc loop2 subi r25, 0x01 brcc loop1 pop r25 pop r24 ret ;----------------------------------------------------------------------- -------- c++code: uart.config(9600,UDR); uint8_t cmd=uart.getChar(); if(cmd=='S') {....dein standby-code...} else if(cmd=='L') {....dein led-code...}
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.