Servus
Ich habe heute mal die Zeit gefunden mir ein kleines Lauflicht zu Programmieren. Ich hab zwar keine Experimentierplatine, macht aber auch nix weil das AVRStudio mir ja erlaubt fröhlich zu Simulieren.
Erstmal der Code, dann meine Fragen:
Code:
#include <avr/io.h>
#ifndef F_CPU
/* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert
(z.B. durch Übergabe als Parameter zum Compiler innerhalb
des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die
"nachträgliche" Definition hinweist */
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"
#define F_CPU 16UL /* Quarz mit 3.6864 Mhz */
#endif
#include <stdint.h>
#include <util/delay.h>
struct s_bPORTB{
uint8_t PIN;
}bPORTB[8];
int main (void) {
DDRB = 0xff;
DDRA = 0x00;
bPORTB[0].PIN=PINB0;
bPORTB[1].PIN=PINB1;
bPORTB[2].PIN=PINB2;
bPORTB[3].PIN=PINB3;
bPORTB[4].PIN=PINB4;
bPORTB[5].PIN=PINB5;
bPORTB[6].PIN=PINB6;
bPORTB[7].PIN=PINB7;
while(1) {
if(PINA & (1<<PINA1)){
for(int i=0; i<8; i++){
PORTB &= (1<<bPORTB[i].PIN);
PORTB |= (1<<bPORTB[i].PIN);
_delay_ms(10);
}
}
}
/* wird nie erreicht */
return 0;
}
Sooo, das läuft auch alles soweit. Dennoch macht es zwei drei Problemchen... 1. macht _delay_ms(10); nicht das was es soll^^ die angabe in den Klammern sollte eigentlich eine Verzögerung in Millisekunden darstellen. Ergo: Wenig wert, wenig Pause, viel Wert, viel Pause. Ist der Wert allerdings größer als 10 springt er in der delay.h rum macht aber sonst nix mehr. Und bei 10 ist die Pause ziemlich genau eine Sekunde => Sehr komisch.
2. Wie kann ich einen Timer Interrupt abfragen? Sprich: Timer Initialisieren, Timer so laufen lassen das zum Beispiel 10Takte/sekunde (sollten dann 100mHz sein oder?) habe und schluss endlich immer dann PINB eins Hochzählen wenn der Timer hochgezählt wird.
3. Finde ich meine Lösung die Pins an Port B hoch zu zählen nicht sooo Elegant. Ginge das Eleganter?
4. AVR Studio sagt unter "Prozessor" 4MHz - in den Controller Optionen habe ich 16000000Hz eingestellt ... finde ich etwas Merkwürdig ^^
Achja, laufen lassen tu ich das immer so:
Build -> Start Debugging -> AutoStep
Und dann entsprechen PinA1 anklicken und so auf 1 setzen (was nich wirklich gut funktioniert wie ich finde, das reagiert arg blöd (oder brauch ich auch da einen debounce?)
So ich hoffe das ist soweit verständlich. Danke fürs lesen und helfen 
edit: die lösung mit der ForSchleife ist auch nicht so schön, einfach der Tatsache wegen das das ganze nicht an Ort und Stelle Stoppt sondern immer bis zum Ende durchläuft (logisch). Die Lösung könnte eine While Schleife sein oder? Also
Code:
while(PINA1==1){
PINB.i=1;
i++;
}
i=0;
So als halber Pseudocode....
Oder?
grüße
Lesezeichen