电子电路
此分类为PCB学习笔记

ISP 在线系统编程

这个问题也是在学单片机开始前就在考虑的,不过本着先学习后实践的目的就搁浅了,这里总结一下。

发展到如今(2019年)常用的方式是通过“在线系统编程(ISP)”这种方式来把程序写入到芯片(MCU)里,这种方式的好处是芯片不需要取出,这里我理解的在线两个字是电路。也就是说即使你的芯片已经焊接在电路版上也不同取下来通过“编程器”来进行程序写入。这里又引申出来几个协议,这些协议是按照电气标准及协议来区分的比如:RS232、RS422、UART等,这里的UART另一种叫法是TTL,其中常用的是RS232和UART(TTL)。

主要的区别RS232是负逻辑电平,5~12v是低电平,而-12~-5v是高电平。而TTL也就是UART没有那么多区分,它的电平只是5V。


网上很多的USBISP、USBASP实际就是USB接口转TTL或RS232协议这样可以对芯片进行程序写入。开始是只有USBISP也就是通过USB接口去实现转换相应的TTL或者RS232协议来达到程序写入的目的。而USBASP查阅了很多资料,也没有发现他俩的区别,不过在USBASP的官网倒是大致看出点眉目。实际USBASP和USBISP在电路设计上是一模一样的,提一点的是不论是USBASP还是USPISP他们都用到了AVR芯片。而USBASP只是一个固件程序,就是将名叫USBASP的固件写入到USPISP的电路里,这个电路里有一个AVR芯片。如果你将USBASP这个固件写到了USPISP这个电路中,那么你就可以通过Progisp这类软件来进行程序烧写。否则你只能通过AVR STUDIO这个程序来进行烧写。在我的理解看来不论是USBISP这个电路,或者是USBASP这个固件。他们本质上都是上面提到的“编程器”即你必须取下MCU芯片,通过引线或者电路中预留好的接口槽进行芯片写入。没有达到ISP可在线系统编程这种思想。他们的大致关系是

屏幕快照 2019-11-07 下午10.26.32.png


以上是对USBASP和USBISP一些解释,以及对“编程器”的一些关联想法,有了这个固件(USBASP)以后可以更好的支持一些协议或者加快写入速度。


对于“在线编程系统”如何实现,实际已经有很成熟的方案,即在电路里增加一块USB转串口的芯片。通过这个芯片达到数据传送到MCU里。因为你的电脑或者其他设备的USB接口是无法直接驱动芯片的。这里就要介绍两个能直接放在电路里的转换芯片。如:MAX232和CH340等。

MAX232是可以将TTL信号转换为RS232信号,或者RS232信号转TTL信号的。不过它的体积相对大一些,焊接在电路中比较占用位置。

CH340是将其他信号转换为TTL信号,体积相对较小,而且各种MCU芯片也相对应的支持TTL信号,TTL的信号线是MCU上的TXD和RXD。

使用上述两个芯片,就不用去做“编程器”了,一般像51单片机就是用的CH340芯片来进行和USB接口通讯写入程序的,注意的是这种情况下,你的整个电路要上电,否则是没办法写入的。而“编程器”则不需要给MCU供电,直接用引线连接到“编程器”上,“编程器”自己就可以供电给它并进行写入。

更为详细的解释,可以自行网上搜索。这里也给出一个建议:如果你的电路是在洞洞板或者面包板上进行实践的,我建议买一个“编程器”某宝搜索“USBASP或USBISP”关键字即可,10块左右。如果你的电路是要制作成PCB并且要进行调试的,我建议你买一块USB转串口芯片,直接焊在电路里依旧是10块左右。


以上仅为个人理解,如有错误还望指出。

ds18b20使用方法

ds18b20是一个比较不错的温度芯片,它是使用了一根线来实现(DS)接口。具体的可以查看相关文档。

这里主要说一下连线方式和怎么读取,连线方式如下图:

微信截图_20191105101508.png

注意这里接了一个4.7Kohm的电阻,这是一个上拉电阻,主要用于数据的传输。对于为什么要加电阻以及详细的解释可以看下面的讨论。如果不加这个电阻是无法进行有效的数据传输的。一开始就是在这里没有解决。

关于从地址的说明如下:

Read ROM(读 ROM) [33H]

Match ROM(匹配 ROM) [55H]

Skip ROM(跳过 ROM] [CCH]

Search ROM(搜索 ROM) [F0H]

Alarm search(告警搜索) [ECH]

Read ROM(读 ROM) [33H]

Match ROM(匹配 ROM) [55H]

Skip ROM(跳过 ROM] [CCH]

Search ROM(搜索 ROM) [F0H]

Alarm search(告警搜索) [ECH]

效果如下

微信截图_20191105102808.png

在DS18B20说明上VCC的位置应该是VDD是数字电源,VCC是模拟电源。这里直接将它俩都接在了模电上,因为我看很多电路图都是如此接法。具体的vcc,vdd的区别可以查阅相关资料。


以上仅为个人理解,如有错误还望指出。

PCB时钟DS1307

考虑到很多人是使用C语言来写的单片机,而我是用的basic语言来写的,所以就不贴代码了。效果图如下

屏幕快照 2019-10-30 下午7.41.57.png

连线方式:所有的时钟总线和数据总线连接到一起,接到MCU的引脚上。

读写方式:通过每个芯片不同的地址来进行数据的写入和读取。

ssd1306显示汉字

屏幕快照 2019-10-06 下午3.54.53.png

我是利用avr来驱动的,关于avr如何连接ssd1306。大家可以翻看手册,能够更好的理解。这里我选择的是IIC的连线方式,所以ssd1306的D1和D2我连在一起了,这也是手册里推荐的方式。

这里我选择的编译器是bascom,听说AVR STUDIO更好并且免费。bascom是收费的,所以使用前你需要购买,网上的破解版我基本上都有尝试,基本上无法使用,因为版本太低。高版本的只提供demo只能编译4K一般够用。

由于内部的驱动方式,什么屏幕点亮,清理内存,复位屏幕。等等一些操作,如果你的线连接的方式对,那么bascom会自动帮你整好整个这一套流程,不然你就得按照手册一步一步去操作。代码直接使用bascom官网提供的:

'-------------------------------------------------------------------------------
'                       SSD1306-I2C.BAS
'                     (c) MCS Electronics 1995-2015
'          Sample to demo the 128x64 I2C OLED display
'
'-------------------------------------------------------------------------------
$regfile = "m88pdef.dat"
$hwstack = 32
$swstack = 32
$framesize = 32
$crystal = 8000000
Config Clockdiv = 1                                         ' make sure the chip runs at 8 MHz
 
Config Scl = Portc.5                                       ' used i2c pins
Config Sda = Portc.4
Config Twi = 400000                                         ' i2c speed
 
I2cinit
$lib "i2c_twi.lbx"                                         ' we do not use software emulated I2C but the TWI
$lib "glcdSSD1306-I2C.lib"                                 ' override the default lib with this special one
 
#if _build < 20784
Dim ___lcdrow As Byte , ___lcdcol As Byte                 ' dim these for older compiler versions
#endif
 
Config Graphlcd = Custom , Cols = 128 , Rows = 64 , Lcdname = "SSD1306"
Cls
Setfont Font8x8tt                                           ' select font
 
Lcdat 1 , 1 , "BASCOM-AVR"
Lcdat 2 , 10 , "1995-2015"
Lcdat 8 , 5 , "MCS Electronics" , 1
Waitms 3000
 
Showpic 0 , 0 , Plaatje
 
End
 
 
$include "font8x8TT.font"                                   ' this is a true type font with variable spacing
 
 
Plaatje:
  $bgf "ks108.bgf"                                         ' include the picture data

这里的glcdSSD1306-I2C.lib库就是一个封装好的ssd1306库。如果你大致能看懂的话,那么你可以继续看,如果不行的话,那就去查些资料吧。首先要知道一点,一个汉字或者字符显示在屏幕上有这么几个要素,宽度,高度,块大小(字体)。这些东西可以去看字体方面的知识点。还有阴码,阳码,扫描方式。bascom显示字符利用了一个叫做font的字体文件,这个文件加载后你就可以使用其中的文字内容。注意它虽然叫做font但是它不是原来windows上理解的这种字体。这种概念要有。

bascom生成这种文件有两种方式:

1、ide本身的font edit 

2、Bascom AVR Font Converter

这两种方式都可以,我推荐第二个。因为它可以生成不同宽度高度和块的font文件,并且它是一键生成的方式(购买后的情况下)。

格式说明:

A font file is a plain text file.

Lets have a look at the first few lines of the 8x8 font:


Font8x8:

$asm

.db 1,8,8,0

.db 0,0,0,0,0,0,0,0 ;

.db 0,0,6,95,6,0,0,0 ; !


The first line contains the name of the font. With the SETFONT statement you can select the font. Essential, this sets a data pointer to the location of the font data.

The second line ($ASM) is a directive for the internal assembler that asm code will follow.

All other lines are data lines.

The third line contains 4 bytes: 1 (height in bytes of the font) , 8 (width in pixels of the font), 8 (block size of the font) and a 0 which was not used before the 'truetype' support, but used for aligning the data in memory. This because AVR object code is a word long.

This last position is 0 by default. Except for 'TrueType' fonts. In BASCOM a TrueType font is a font where every character can have it's own width. The letter 'i' for example takes less space then the letter 'w'. The EADOG128 library demonstrates the TrueType option.

In order to display TT, the code need to determine the space at the left and right of the character. This space is then skipped and a fixed space is used between the characters. You can replace the 0 by the width you want to use. The value 2 seems a good one for small fonts.

All other lines are bytes that represent the character.

看不懂的话直接右键翻译,知道这些后你还是无法显示汉字,因为你不知道怎么去索引font的汉字位置,我也是翻来翻去看到的。打开ide的font edit。你会发现一个ascii。

屏幕快照 2019-10-06 下午4.12.45.png

可以看到有32和33,所以直接lcdat 1,1,chr(32)就可以索引到“王”这个汉字

整个代码

Cls
Setfont Font16x16
Lcdat 0,0,chr(32);
Setfont Font8x8tt 
Lcdat 8,16, "And" 
Setfont Font16x16
Lcdat 0,16+8+8+8-3,chr(33);
Setfont Font8x8tt 
Lcdat 8,16+8+8+8-3+16, "PCB"
Waitms 3500
Cls

批量制作汉字的话可以利用PCtoLcd,配置模式如下:

屏幕快照 2019-10-06 下午4.15.21.png

这是ssd1306芯片的取模方式的配置。其他的需要自己看手册。这样就会生成db代码。然后把db代码放到一个font文件里,载入到font edit 就可以看到效果。 如果遇到错误建议删除空行。



ssd1306内部有一个升压装置,所以外部电压可以相对低一些,不过是选取3.3v还是5v要看外部电阻,线路连接时外部电阻与内部升压装置连接。

关于集成电路IO引脚电平

具体的IO引脚的实现可以百度,有很多电路图,会用到场效应管和其它元器件来实现IO接口。这里讨论的是IO输入和输出高电平。特别是对电平的一些理解。

IO引脚有两种模式:输入输出。

输入:外部到单片机内部

输出:单片机内部到外部

IO一般输入输出指的是电平输入输出。

电平的解释:两点的电功率或者电压之比的对数。

电压:两点间的电势或者电位的差。(实际很好理解,一个电源一个电阻串联,测电阻两端电压是多少,根据欧姆定律很容易算出。电压就是我们正常生活中的,只不过概念理解起来很多。涉及到一个又一个细小概念分支)

电位:又叫做电势或电位,单位是V。(涉及到静电学和电动力学,自行百度。)

电功率:电流在单位时间内所做的功,单位:瓦特 简称:瓦 符号:W 表示方式:P(公式上)

电能:电流以各种形式做功的能力,单位:度 学名:KW.H 也就是一小时消耗多少千瓦。

电功率和电能看这容易混淆,学校的知识我也忘得差不多了,百度了很多,发现有一个解释比较容易理解。

电能是路程,电功率是速度。一个人一个小时可以跑100米这是速度,而这100米是路程。某元器件的电能是100电能,那么在一个小时内他可以产生100K的电功率。在两个小时就是200K的电功率。

对数:幂的逆运算。比如2的3次方是8。那么8以2为底的对数就是3。

电平也分为高电平和低电平,高电平代表:1,低电平代表:0。由于1和0是二进制,所以就可以组成一些运算,比如逻辑门:非门、或门、与门等。高电平是大于3v,低电平是小于1.5v而1.5-3v之间的是中间电平,一般不做处理。

高低电平用方形图表示

屏幕快照 2019-09-23 上午12.53.40.png

由于是连续的产生电压或者电功率所以电平也是连续的,方形图表示的话也会是一直连续下去这里只给出一个,连续的方形图也可以叫做脉冲。这里引出一个概念叫做总线,总线可以用来传输数据,具体的实现方式实际也是利用电平。视频资料:https://www.bilibili.com/video/av7230090?from=search&seid=5145470121650526078。还有一点,图形上看着是直棱直角的直线,实际电流过程中比如在刚通电的时候,电流是不稳的所以画出来的线应该是有波动的。不过这种波动非常小或者说非常快的趋于平稳,所以画图的时候近似的画成直线,但是实际中它并非直线。

上拉电阻:上拉就是将不确定的信号通过一个电阻钳位在高电平,电阻同时起限流作用。下拉同理,也是将不确定的信号通过一个电阻钳位在低电平。这里的信号指的是模拟信号例如声音或者数字信号例如1和0的高低电平,设计到模电和数电。想更深入的了解可以看一看模电和数电,这里我还没看,所以没办法解释信号。

上拉电阻一般接在电源位置起到拉高电平输出,下拉是接在接地端,起到拉低电平的作用,可以通过欧姆定律串并联来理解。

钳位:钳位是指将某点的电位限制在规定电位的措施。

总的来说,上拉电阻我接上以后这点的电平会变高,因为会分压,分到很大一部分的电压,所以相对于某一点,我是高电平。

一张图理解一下(个人理解):

屏幕快照 2019-09-23 上午1.22.51.png


当IO为输出的时候,A点相对于B点的电压一定要小,所以这里要输出低电平。如果输出高电平,也就是A点的电压比b点的电压大的话,那么LED是不会亮的。因为LED的负极比正极电压还大了。这里的LED是负极接IO正极接VCC。

如果是LED正极接IO,而负极接地,那么就要输出高电平。因为A点相对于接地端的电压一定要大。才能让电流流通。

而作为输入的时候我觉得是A点的电压相对于集成电路内部的电平也就是电功率或者电压的比值。这里的B点只是一个参考,也可能这个B点在LED负极的前一点。