Hírek:

Fontos tudnivalók a migrációval kapcsolatban, Kérlek nézd meg a Régi fórumról új fórumra való költözés

Main Menu

Segítség, béna vagyok!

Indította gaben, 2024 április 09, 15:35

Előző téma - Következő téma

9hpa53xy

#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
#include <util/sbit.h>
 
 
// LCD pinout definition
/*var
 LCD_RS : sbit at PORTB0_bit;
 LCD_EN : sbit at PORTB1_bit;
 LCD_D4 : sbit at PORTB2_bit;
 LCD_D5 : sbit at PORTB3_bit;
 LCD_D6 : sbit at PORTB4_bit;
 LCD_D7 : sbit at PORTB5_bit;
 //
 LCD_RS_Direction : sbit at DDB0_bit;
 LCD_EN_Direction : sbit at DDB1_bit;
 LCD_D4_Direction : sbit at DDB2_bit;
 LCD_D5_Direction : sbit at DDB3_bit;
 LCD_D6_Direction : sbit at DDB4_bit;
 LCD_D7_Direction : sbit at DDB5_bit;*/
 
//keypad definitions
 #define key_d0_dir   : SBIT(DDRB,7)
 #define key_d1_dir   : SBIT(DDRD,7)
 #define key_d2_dir   : SBIT(DDRC,0)
 #define key_d3_dir   : SBIT(DDRC,1)
 #define key_d4_dir   : SBIT(DDRC,2)
 #define key_d5_dir   : SBIT(DDRC,3)
 #define key_d6_dir   : SBIT(DDRC,4)
 #define key_d7_dir   : SBIT(DDRC,5)
 //
 #define key_d0_out   SBIT(PORTB,7)
 #define key_d1_out   SBIT(PORTD,7)
 #define key_d2_out   SBIT(PORTC,0)
 #define key_d3_out   SBIT(PORTC,1)
 #define key_d4_out   SBIT(PORTC,2)
 #define key_d5_out   SBIT(PORTC,3)
 #define key_d6_out   SBIT(PORTC,4)
 #define key_d7_out   SBIT(PORTC,5)
 //
 #define key_d0_in  SBIT(PINB,7)
 #define key_d1_in  SBIT(PIND,7)
 #define key_d2_in  SBIT(PINC,0)
 #define key_d3_in  SBIT(PINC,1)
 #define key_d4_in  SBIT(PINC,2)
 #define key_d5_in  SBIT(PINC,3)
 #define key_d6_in  SBIT(PINC,4)
 #define key_d7_in  SBIT(PINC,5)
 //
 #define spkout      SBIT(PIND,3)
 #define spkout_dir SBIT(DDRD,3)
 
 unsigned char lastack;
 unsigned char lastnack;
 unsigned char currentsyn;
 unsigned char lastsyn;
 unsigned char eat;
 unsigned char pdt;
 
 char passcode[4];
 char newcode1[4];
 char newcode2[4];
 
 bool armed;
 bool proximity;
 bool commerror;
 bool showzones;
 bool zone0;
 bool zone1;
 bool zone2;
 bool zone3;
 bool zone4;
 bool zone5;
 bool zone6;
 bool zone7;
 bool zone8;
 bool zone9;
 
 
//******************************************************************************
//** Beep **
//******************************************************************************
void beep()
{
   int cycle;
   for (cycle=0; cycle<255; cycle++)
   {
      spkout = !spkout;
      _delay_us(80);
   }
}
 
 
//******************************************************************************
//  M A I N  P R O G R A M
//******************************************************************************
int main(void)
{
 
spkout_dir==1;
      while(1)
      {
beep();
      }
}

9hpa53xy

lefordul, be is égethető, és nem csinál semmit :3

s7manbs8

 
 
#ifdef F_CPU
  #undef F_CPU
#endif
 
#define F_CPU 16000000UL      // órajeled frekije
 
 
#include <avr/io.h>
#include <util/delay.h>
 
 
void beep() {
   
  uint16_t cycle;
  for (cycle=0; cycle<5000; cycle++)
  {
    PORTD=(PIND&(~(1<<3)))|((~PIND)&(1<<3));  
    _delay_us(1);
  }
}
 
 
 
int main() {
 
  DDRD=(1<<3);  // kimenetre állítva a 3. bit a többi bemenet
 
  while (1)
    beep();
  return 0;
}

s7manbs8

Ezt próbáld meg:
 
 
 
#ifdef F_CPU
  #undef F_CPU
#endif
 
#define F_CPU 16000000UL      // órajeled frekije
 
 
#include <avr/io.h>
#include <util/delay.h>
 
 
void beep() {
   
  uint16_t cycle;
  for (cycle=0; cycle<5000; cycle++)
  {
    PORTD=(PIND&(~(1<<3)))|((~PIND)&(1<<3));  
    _delay_ms(1);
  }
}
 
 
 
int main() {
 
  DDRD=(1<<3);  // kimenetre állítva a 3. bit a többi bemenet
 
  while (1)
    beep();
  return 0;
}

9hpa53xy

Biztosan működik, de maszkolással kellene. ez a kulcsa az egésznek.

s7manbs8

Hogy maszkolással ?  
 
Ez a sor pont azt csinálja.
 
PORTD=(PIND&(~(1<<3)))|((~PIND)&(1<<3));  
 
PIND&(~(1<<3))  ez a PORTD 3. bitje
(~PIND)&(1<<3)  ez ugyanannak a negáltja  
majd vagy kapcsolattal összerakódik.

s7manbs8

Itt egy sbit.h   is :
 
#ifndef sbit_h_
#define sbit_h_
 
#include <avr\io.h>
 
//          Access bits like variables:
struct bits {
  uint8_t b0:1;
  uint8_t b1:1;
  uint8_t b2:1;
  uint8_t b3:1;
  uint8_t b4:1;
  uint8_t b5:1;
  uint8_t b6:1;
  uint8_t b7:1;
} __attribute__((__packed__));
 
#define SBIT_(port,pin) ((*(volatile struct bits*)&port).b##pin)
#define   SBIT(x,y)   SBIT_(x,y)
 
#endif

9hpa53xy

úgy maszkolással hogy egy-egy i/o lábat változóként kezelsz, nem byteként. pl pascalban:
 
CD_RS_Direction : sbit at DDB0_bit;

s7manbs8

Ha SBIT-tel akarod, akkor meg így néz ki elvileg: a toggle:
 
SBIT(PORTD, PIN3)=~SBIT(PIND, PIN3);

s7manbs8

A lényeg, hogy olvasáskor PIND van ott, íráskor meg PORTD !!!

s7manbs8

#define PIEZO_OUT SBIT(PORTD, PIN3)
#define PIEZO_IN  SBIT(PIND, PIN3)
 
...
 
PIEZO_OUT=~PIEZO_IN;
 
 
 
valami ilyesmi

000000000

Bitenként nem lehet hivatkozni a változó bitjeire?
Így gondolom:
 
PORTD.3 = 0;
 
és szerintem a DDRD 3. bitjét 1-be kéne állítanod, hogy kimenet legyen az a láb, különben bemenet.

s7manbs8

A PORTD az ez:  
 
#define PORTD   _SFR_IO8 (0x0B)

s7manbs8

Az meg ez:
 
#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
 
tehát (*(volatile uint8_t *)(mem_addr))

9hpa53xy

 If (KEY_D4_In=0) and (KEY_D5_In=0) and (KEY_D6_In=0) and (KEY_D7_In=0) then
 
ez hogy nézne ki helyesen C-ül ? :)