Hallo Leute,
ich habe eben hier angemeldet, da ich bitte unbedingt Hilfe von euch
benötige.
Und zwar machen wir gerade in der Schule Projekte, dort geht es auch ums
programmieren.
Mein Projekt soll ein Timer werden. - Bestückt wurde die Platine mit
einem ATtiny2313, 9 LEDs und einem Taster.
Jede 10 Sekunden soll eine LED angehen, sobald 60 Sekungen vergangen
sind, sollen diese wieder ausgehen und LED 7 angehen. Danach sollen die
6 LED wieder hinauf zählen und LED 9 soll sich anschalten. Zum Schluss
soll sich LED 8 einschalten.
Wenn der Taster gedrückt wird, soll der Timer resetet werden.
Pin belegung:
LED1 Port D 0x08
LED2 Port D 0x10
LED3 Port D 0x20
LED4 Port D 0x40
LED5 Port B 0x01
LED6 Port B 0x02
LED7 Port B 0x04
LED8 Port B 0x08
LED9 Port B 0x10
Taaster Port D 0x04
Leider bin ich ein totaler Neuling und verstehe nicht sehr viel von der
C-Programmierung. - Vllt. hat ja jemand Lust & Zeit von euch den
Programmiercode zu schreiben :-) !!
LG und Danke
Siehe Beitrag
Idiotischer Anfängerfehler
von gestern.
In der while-Schleifewird die LED ganz schnell ein- und ausgeschaltet.
Nach dem Ein- oder Ausschalten mus eine Pause rein. Zum Beispiel von
0,5 Sekunden.
Hier wird dir niemand ein Programm schreiben, im Gegenteil, die meisten
sind hier, um es wieder auseinander zu nehmen :-)
Jetzt mal Ernst beiseite, zerlege die Aufgabenstellung in einzelne
Schritte:
Marc S. schrieb:> Jede 10 Sekunden soll eine LED angehen
Du brauchst also einen 10 Sekunden Timer. Lies dir im AVR Tutorial den
Abschnitt über Timer durch und erschaffe einen Timer, der alle 10
Sekunden eine LED an bzw. ausschaltet.
> Wenn der Taster gedrückt wird, soll der Timer resetet werden.
Lies dir den Artikel über Input/Output durch und erfinde eine
Unterroutine, dir dir den Zustand des Taster zuverlässig zurückgibt, am
einfachsten über True und False.
> LED1 Port D 0x08> LED2 Port D 0x10> LED3 Port D 0x20> LED4 Port D 0x40> LED5 Port B 0x01> LED6 Port B 0x02> LED7 Port B 0x04> LED8 Port B 0x08> LED9 Port B 0x10
Nun machst du dir Gedanken über die Anordnung der LED. Da ihr eine
'Kraut- und Rüben' Pinanordung gewählt habt, ist es evtl. am
einfachsten, ein Array (-> C-Strukturen) zu erschaffen, in dem alle
möglichen Zustände der LED gespeichert sind.
Noch ein Tipp. Wenn du so deine Ports ansprichst
> while (!(PORTD &= 0b00000100));
weisst du nach einem Monat nicht mehr, was du da eigentlich machst.
Abgesehen von dem Fehler, das du den PORT liest und nicht das PIN
Register , sind klare Definitionen besser:
Die wichtigste Frage ist doch:
wie ist dein Kenntnisstand? Welche Dinge solltest du eigentlich schon
können?
Denn eine handwerklich solide Lösung mit einem Timer nimmt dir dein
Lehrer nicht ab. Halte die nicht für blöd. Der weiß auch ganz genau,
dass da was nicht stimmt, wenn die größte Pfeife in der Klasse plötzlich
mit dem handwerklich besten Programm daher kommt.
Wenn du noch nichts anderes gelernt hast, dann ist _delay_ms dein
Freund, auch wenn es eine schlechte Lösung ist. Aber irgendwo muss man
mal anfangen.
Ooooh Lippy... so lernt er das doch nie!!!
Und da wundert man sich, dass sich so viele mit Plagiatsvorwürfen
herumschalgen müssen, wenn es einem so einfach gemacht wird.
Aber Erklärung gibt es keine dazu.
Wie Karl Heinz schon sagte:
>wenn die größte Pfeife in der Klasse plötzlich>mit dem handwerklich besten Programm daher kommt.
Aber wenn er es kapiert hat und erklären kann....
Und wenns keine Klausur im geschlossenen Raum ist, ist Hilfe zulässig...
Vielen vielen Dank!
Selbstverständlich mache ich mir meine Gedanken dazu, Hilfe ist
natürlich in diesem Projekt von allen Seiten zulässig!
Tests und Schularbeiten gibt es in diesem Fach auch nicht ;-)
Danke!!
LG
Marc S. schrieb:> Selbstverständlich mache ich mir meine Gedanken dazu,
Na da bin ich neugierig.
Wenn ich deine Fragen zu Grunde lege, dann dauert das 3 Monate, bis du
den Code verstanden hast.
Ganz ehrlich Matthias. Ich denke nicht, dass du ihm damit einen Gefallen
getan hast. Das geht weit darüber hinaus, was er mit seinem Wissen noch
verstehen kann. Da kannst nicht einen Grundschüler mit
Differentialgleichungen überfallen, wenn er Probleme mit dem kleinen
Einmal Eins hat. Selbst wenn Diff-Gleichungen die richtige Lösung für
eines seiner Probleme wäre.
Haha sehr lustig, ist wohl einer der Experten hier^^
Also ich versuche das irgendwie nachzuvollziehen.
Ob das Programm funktioniert oder nicht kann ich nicht sagen, da ich den
Fehler bekomme:
Build FAILED.
========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped
==========
OK.
Nachdem jetzt einige Zeit vergangen ist, mein Rat:
Leg das Programm beiseite. Man könnte zwar die paar Tippfehler
korrigieren aber für jemanden, der in seiner Entwicklungsumgebung noch
nicht einmal die Fehlermeldungen findet ist das wohl aussichtslos.
Nur um das klar zu stellen: Die Vorlage ist absolut in Ordnung. Da gibt
es nichts daran auszusetzen. Genau so würde man das machen, wenn man
sein Handwerk versteht.
Schreib das so, wie es deinem Können angemessen ist. Du bist nun mal
noch kein Meister, sondern fängst gerade erst mit der Ausbildung an.
Schreib es so, wie es dem entspricht, was du kannst und was du schon
gelernt hast. Und wenn ich nach der Jahreszeit gehe und daran denke,
dass die Semester gerade erst angefangen haben, dann kann das noch nicht
viel sein.
D.h. Portpin setzen, delay, nächsten Portpin setzen, delay, etc. etc.
Generell wäre das programm nun fertig.
Jedoch funktioniert bei mir die Sleep Funktion noch nicht ganz.
Der Timer soll nach der Slee Funktion erwachen. - Weiß wer an was es
liegt?
1
/*
2
* AVRGCC1.c
3
*
4
* Created: 16.10.2013 13:01:56
5
* Author: Marc Svata
6
*/
7
8
#include<avr/io.h>
9
#include<avr/sleep.h>
10
#include<avr/interrupt.h>
11
12
13
14
//#define ten_secs 271000
15
#define ten_secs 27100
16
17
longi;
18
19
/*
20
void sleep() // Timer befindet sich im Sleep Modus
> - Weiß wer an was es liegt?
Das funtkioniert so nicht.
Um den µC wieder aus dem Sleep rauszuholen, benötigt es einen Interrupt.
Von alleine wacht der µC nicht mehr auf.
Lass den sleep erst mal beiseite.
Dein Programm krankt noch an ganz anderen Stellen. Zb wird dir jeder
vernünftige Compiler, wenn er das hier
1
for(i=0;i<ten_secs;i++);
optimieren darf, die Schleife einfach rauswerfen.
Um derartige Zeitverzögerungen zu machen, gibt es die Funktion
1
_delay_ms(....)
die so gebaut wurde, dass sie gezielt Zeit verbrutzelt.
In Anbetracht dessen, dass du mit Timern noch nicht umgehen kannst, ist
das das Mittel der (momentanen) Wahl.
Sleep ist etwas, das kommt irgendwann. Aber noch nicht jetzt. Dazu fehlt
dir noch viel zu viel.
Der Sleep muss aber (leider) bei meinem Programm gemacht werden
-> Anforderung der Lehrperson.
Problem hierbei ist zurzeit das er nicht in den Slee Modus geht.
Interrupt muss dann noch gemacht werden...
Ansonsten funktioniert der Timer wunderbar...
Marc S. schrieb:> Der Sleep muss aber (leider) bei meinem Programm gemacht werden> -> Anforderung der Lehrperson.
Jetzt muss ich lachen.
Dein Programm hat Probleme ohne Ende.
Da sind gefühlte 8-hundert-2-und-fünfzig Problemkreise die wichtiger und
dringender in deinem Programm sind.
Und du kümmerst dich jetzt um Problem Nummer 853?
Sorry. Aber da muss ich lachen.
Verstehe ich nicht.
Das Programm funktioniert ja (Timer zählt 3 Minuten herunter mit LED
Ansteuerung).
Vllt. ist es 'komisch' geschrieben, weil ich eben ein Anfänger bin ;-)
> Ansonsten funktioniert der Timer wunderbar...
Das tut ein Klebeband an der durchgerosteten Autokarrosserie auch. 10
Minuten lang.
PS: Ein 'Timer' ist in diesem Zusammenhang eine Hardwarekomponente im
µC. Eine eingebaute Funktionalität. Das hat nichts damit zu tun, dass du
das ganze Gerät einen 'Timer' nennst.
Wenn ich von "du kannst mit Timern noch nicht umgehen" rede, dann meine
ich mit "Timer" ersteres und nicht letzteres.
Nicht wirklich.
Aber was soll ich dir hier erklären?
Mehr als "der sleep kann nicht funktionieren, weil es nichts gibt was
den µC wieder aus dem Sleep herausholen könnte" kann ich dir jetzt nicht
sagen.
Ich kann hier nicht mit dir 5 Stunden Unterricht im Schnelldurchlauf auf
3 Bildschirmseiten kompremiert nachholen.