ik heb een programma geschreven om te testen of ik een waarde kan opslagen van een ingang.
het probleem is wanneer ik bv zeg dat high gelijk is aan de ingang van een poort, en verder in mijn programma zeg ik dan dat wanneer high hoog is dat er een ledje moet branden. dan gebeurt er niks. du het ledje gaat niet branden.
maar als ik het simuleer in avr dan werkt het wel want dan zie ik dat de waarde van high veranderd als de schakelaar veranderd. en dat de waarde van mijn uitgangs poort veranderd als high veranderd.
wat doe ik hier fout? zie ik iets over het hoofd?
hier is mijn code
#include <stdio.h>
#include <avr/io.h>
void main (void)
{
int high;
PORTD = 0xFF;
DDRD = 0x00;
PORTB = 0xFF;
DDRB = 0xFF;
PIND = 0xFF;
while (1)
{
if (( PIND & 0x10) == 0)
{
high=1;
PORTB = PORTB & ~0x80;
}
else
{
high=0;
PORTB = PORTB | ~0x7F;
}
if (high == 1)
{
PORTB = PORTB | ~0xFB;
}
if (high == 0)
{
//PORTB = PORTB & ~0x04;
}
}
return 0;
}
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Een echte fout kan ik niet ontdekken. Maar hou er wel rekening mee, dat "high" maar '1' zal zijn zolang je PD4 laag maakt.
En maak er een gewoonte van, de namen van de pinnen te gebruiken en er commentaar bij te plaatsen. Dat leest heel wat prettiger. Zo, dus:
#include <stdio.h>
#include <avr/io.h>
int main(void)
{
int high;
PORTD = 0xFF; // Alle pull-up R's van PORTD activeren
DDRB = 0xFF; // PORTB = uitgang
while (1) {
if ((PIND & (1 << PIND4)) == 0) { // Is PD4 laag?
high = 1;
PORTB = PORTB & ~(1 << PB7); // PB7 laag maken
} else {
high = 0;
PORTB = PORTB | (1 << PB7); // PB7 hoog maken
}
if (high == 1) {
PORTB = PORTB | (1 << PB3); // PB3 hoog
}
if (high == 0) {
//PORTB = PORTB & ~(1 << PB3);
}
}
return 0;
}
Ja dat weet ik dat 'high' alleen '1' is wanneer ik PD4 laag maak.
Maar vermits op men bordje mijn drukknoppen actief lage drukknoppen zijn, moet ik mijn drukknop indrukken om laag te maken.
Het zelfde verhaal met mijn leds deze zijn ook actief laag gestuurd.
Eigenlijk als ik het goed voor heb zou met dit programma ik gewoon PD3 aansturen als ik de drukknop niet indruk en PD7 aansturen als ik hem wel indruk.
PD7 werkt goed op men bordje maar PD3 die doet niks.
Maar in mijn simulatie werken ze beide goed....
maar als ik het simuleer in avr dan werkt het wel want dan zie ik dat de waarde van high veranderd als de schakelaar veranderd. en dat de waarde van mijn uitgangs poort veranderd als high veranderd.
Ik neem aan dat je bedoelt dat high verandert als de schakelaar veranderd wordt? (zo moeilijk is Nederlands toch niet??)
Ik kan niet helemaal doorzien waarom je nou loopt te rommelen met 'high' en dat niet gewoon binnen je eerste if kan.
Verder scheelt het waarschijnlijk wel als je je SETs op PRTD doet als je PD7 en PD3 aan wilt sturen. Overigens trek je met 0xFB en 0x04 aan Px2 en niet aan Px3, maar dat mag de pret niet drukken.